2011-09-02 173 views
1

我找不到为什么在这里的第二个例子工程,但先不一个很好的解释:XSLT属性匹配名称空间

<?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> 

回答

0

没有关于命名空间的任何问题。两种表达都是正确的,并产生预期的结果。

假设(至少)的指令的背景模板,与第一条指令你要打印WSDL的文本节点后代:消息给定@name。没有任何内容会被打印出来,因为该内容中没有文字。

第二条指令将打印@name的值。这是正确的。

+1

是的,你是绝对正确的感谢解释。第一个表达式确实返回了文本节点,这就是我错过的知识。如果我现在理解正确/ wsdl:definitions/wsdl:message [@name = $ messageName]/@ name在这种情况下会给我我想要的。 – simon

+0

是的。这是正确的。如果您认为您的问题已解决,请确保** [接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)**。 –

+0

个人而言,我更喜欢XPath表达式,其中** @ name **只重复一次。 –