在xslt文件中未定义“前缀'soap'”

时间:2011-01-25 14:09:02

标签: html xml xslt

我正在尝试使用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>

但是,我得到“前缀'肥皂'没有定义”,我该如何解决这个问题? 感谢。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

在您的情况下,名称空间前缀soap只是真实名称空间URI的简写。为避免您到处都有http://soap/envelope/,您可以定义soap代表http://soap/envelope/,并在文档的其余部分使用soap

这意味着如果您使用名称空间前缀,则必须对其进行定义,以便找到真正的名称空间。

您还可以声明pizzahttp://soap/envelope/相对应,然后使用它。 soap名称空间前缀不是特殊的。