2017-04-12 53 views
0

XSLXSLT:節點是否可以作爲變量在其他地方使用?

<xsl:variable name="varName> 
    <xsl:value-of select="/can/be/a/long/path/down/xml/item[@id=1] /> 
</xsl:variable> 

XML

<xml> 
    <item id="1" text="Yes"> 
    <item id="2" text="No"> 
</xml> 

使用

我想我可以用這樣的:

<xsl:when test="$varName/@text = 'Yes'"> 
blah 
</xsl:when> 

但空白空間代替變量生成。這甚至可能,有一個節點作爲變量,並在其他地方使用?

回答

4
<xsl:variable name="varName"> 
    <xsl:value-of select="/can/be/a/long/path/down/xml/item[@id=1]" /> 
</xsl:variable> 

這是我看到的最常見的XSLT錯誤之一。通常人們預期的是:

<xsl:variable name="varName" select="/can/be/a/long/path/down/xml/item[@id=1]"/> 

而且大部分時間,代碼工作得很好,但它是慢了許多比它需要。但有時候,兩個結構在封面下面的差異很大,這個事實再次讓你咬牙切齒。

爲了理解差異,帶有select屬性的xsl:variable將變量綁定到select表達式計算的任何值,在本例中,該變量是一組零個或多個item元素。相比之下,具有嵌套指令的xsl:variable會創建一個文檔節點(XSLT 2.0)或結果樹片段(XSLT 1.0),其內容是這些指令生成的任何內容的副本。在這種情況下,因爲內容是xsl:value-of指令,變量包含所選節點的字符串值的副本。

當然,所選節點的字符串值沒有任何屬性,因此test="$varname/@text = 'x'"將始終返回false。