与命名空间的XSLT属性匹配

时间:2011-09-02 02:46:06

标签: xslt attributes namespaces matching

我找不到一个很好的解释为什么第二个例子在这里有效,但第一个没有:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xsd"
    version="2.0">

  <xsl:template match="/">

    <xsl:value-of select="/wsdl:definitions/wsdl:message[@name = $messageName]"/>
    <xsl:value-of select="/wsdl:definitions/wsdl:message/@name[. = $messageName]"/>

  </xsl:template>

</xsl:stylesheet>

上下文是在WSDL文档中查找特定的命名消息。我怀疑它与命名空间有关,只是因为XSLT严重阻碍了我,但我不明白为什么?

有人可以为我发光,我不喜欢尝试获得解决方案,因为它不会导致理解。

WSDL的相关部分是:

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/">

   <message name="retrieveCustomerYtdResponse">
      <part name="parameter"/>
   </message>
   <message name="retrieveCustomerYtdRequest"/>

</definitions>

1 个答案:

答案 0 :(得分:0)

名称空间没有任何问题。两个表达式都是正确的,并产生预期的结果。

假设(至少)指令的上下文模板,使用第一条指令,您尝试使用给定的 @name 打印 wsdl:message 的后代的文本节点。没有任何内容会打印出来,因为该元素中没有文字。

第二条指令将打印 @name 的值。那是对的。