在xslt文件中出现“前缀'soap'未定义”的错误

7
我正在尝试转换一个包含XML数据的字符串(来自Web服务的响应)。我试图从简单的开始,只获取名称:
<?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'”的错误,我该如何解决? 谢谢。

好问题,+1。请查看我的答案以获取解释和完整的解决方案。 - Dimitre Novatchev
2个回答

6
在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/"
>

@Alejandro:是的,今天早上我有点困。 :) - Dimitre Novatchev

0

命名空间前缀soap只是真实命名空间URI的简写。为了避免在文档中到处使用http://soap/envelope/,您可以定义一次soap代表http://soap/envelope/,并在文档的其余部分中使用soap

这意味着如果您使用命名空间前缀,则必须定义该前缀以便找到真实的命名空间。

您还可以声明pizza对应于http://soap/envelope/并使用它。 soap命名空间前缀并不特殊。


那么我应该使用 <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" xmlns:soap=",然后使用" rel = "nofollow noreferrer">http://soap/Envelope/Body/">,然后使用 <xsl:for-each select="soap/ABRSearchByABNResponse/ABRPayloadSearchResults/response/legalName">,再使用 <tr> 和 <td><xsl:value-of select="givenName"/></td></tr> 吗? - peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接