2012-01-12 41 views
8

鑑於變量中的xsl:模板匹配模式

有一個全局變量XSLT樣式表:

<xsl:variable name="lang" select="/response/str[@name='lang']"/> 

問題

從哪兒來的限制,在謂詞使用變量是xsl:template匹配模式不正確,但在xsl:apply-templates選擇模式中可以接受?

<!-- throws compilation error, at least in libxslt --> 
<xsl:template match="list[@name='item_list'][$lang]"/> 

<!-- works as expected --> 
<xsl:template match="list[@name='item_list'][/response/str[@name='lang']]"/> 

<!-- works as expected --> 
<xsl:template match="response"> 
    <xsl:apply-templates select="list[@name='item_list'][$lang]"> 
</xsl:template> 
+0

我不確定這是限制,但你確定你的'$ lang'包含字符串值(或數字),但沒有一些節點集? – YuS 2012-01-12 17:04:26

+0

@yuri,它確實包含一個節點集,但我沒有看到上下文中不允許節點集的原因。 – newtover 2012-01-12 17:09:19

+1

我不能告訴你關於爲什麼限制是在XSLT 1.0中指定的細節,但我可以告訴你它已經在XSLT 2.0中消失了,所以你可能想考慮移動到該版本的語言和它的一個實現撒克遜9或AltovaXML。 – 2012-01-12 17:59:37

回答

10

變量不允許在XSLT 1.0的匹配表達式中使用。

從XSLT 1.0規範:Defining Template Rules

它是爲匹配屬性的值包含一個 VariableReference錯誤。

XSLT 2.0中的匹配表達式允許使用變量

從XSLT 2.0規範:Syntax of Patterns

圖案可以與一個id FO或鍵功能呼叫啓動,條件是 待匹配無論是作爲文字或參考 給一個變量被提供的值或參數,並且鍵名(在鍵 函數的情況下)作爲字符串文字提供。這些模式永遠不會 與其根不是文檔節點的樹中的節點相匹配。

+0

謝謝!在提出要求之前,我仔細看了一下規範的那一部分,但不知何故忽略了你引用的那句話。我需要睡得更好! – newtover 2012-01-12 18:31:50

+1

@newtover:P.S.您還問過爲什麼變量引用「在xsl:apply-templates選擇模式中可接受」。答案是'xsl:apply-templates'中的選擇不是模式,而是XPath表達式。模式看起來很像XPath表達式,但它們不盡相同。這個變量引用限制是一個差異(在XSLT 1.0中)。 – LarsH 2013-08-27 21:42:40

+0

Mads,根據我對規範的閱讀,我不認爲你關於匹配表達式允許變量的聲明是相當準確的。我想你可以說「XSLT 2.0中的匹配表達式允許使用變量」,即使它們引用了文檔節點。只是包含key()和id()函數調用的模式永遠不會匹配樹中的一個節點,該樹的根不是文檔節點......但是這並不限制模式中變量的值。 – LarsH 2013-08-27 22:00:57