2011-09-02 115 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 **只重複一次。 –