Получение "префикса' soap 'не определено" в файле xslt

Я пытаюсь преобразовать строку с данными xml (ответ от веб-службы). Я попытался начать просто, просто получив имя:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
      <table>
        <tr>
          <th>Name</th>
        </tr>
        <xsl:for-each select="soap:Envelope/soap:Body/ABRSearchByABNResponse/ABRPayloadSearchResults/response/legalName/">
          <tr>
            <td>
              <xsl:value-of select="givenName"/>
            </td>      
          </tr>   
      </xsl:for-each>

      </table>
    </xsl:template>
</xsl:stylesheet>

однако я получаю "префикс' soap 'не определен", как это исправить? Спасибо.

2 ответов


в XSLT любой префикс пространства имен, используемый в выражении XPath, должен быть определен в соответствующем объявлении пространства имен.

это не относится к вашему коду и, следовательно, к ошибке.

решение:

объявите пространство имен soap:

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     
 xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
 xmlns:soap="http://soap/envelope/"
>

префикс пространства имен soap в вашем случае это просто сокращение для реального URI пространства имен. Чтобы избежать Вас есть http://soap/envelope/ везде, вы можете определить один раз, что soap расшифровывается как http://soap/envelope/, и использовать soap в остальной части документа.

это означает, что если вы используете префикс пространства имен, он должен быть определен так, что реальное пространство может быть найдено.

вы также можете объявить, что pizza соответствует http://soap/envelope/ и использовать это вместо этого. The soap префикс пространства имен ничего особенного.