2017-04-05 153 views
2

我想處理表格單元格中的每個規則,並且當我使用變量時訪問正確的屬性值時遇到問題。XSLT 2.0選擇節點特定與變量與直接選擇

我想只處理底部規則(@標誌=「b」)。鑑於這種XML

<?xml version="1.0" encoding="UTF-8"?> 
<cell> 
    <rules> 
     <rule flags="t" width="0.3528" colour="black"/> 
     <rule flags="b" width="0.3528" colour="black"/> 
     <rule flags="b" width="0.7056" colour="none"/> 
     <rule flags="b" width="0.3528" colour="black"/> 
    </rules> 
<para>19.3%</para> 
</cell> 

如果我用這個XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="cell"> 
    <xsl:variable name="i">2</xsl:variable> 
    <xsl:value-of select="child::rules/rule[contains(@flags, 'b')][2]/@width"/> 
    </xsl:template> 
</xsl:stylesheet> 

結果是「0.7056」,這正是我期待的,但如果我在選擇使用可變

 <xsl:value-of select="child::rules/rule[contains(@flags, 'b')][$i]/@width"/> 

結果是'0.3528 0.7056 0.3528'。它抓住了我所有規則元素的寬度屬性,而不僅僅是第二個元素,即使該變量的值爲2.

我想知道爲什麼使用變量與特定數字會產生差異,以及我如何去解決這個問題。

+0

我認爲它必須處理的變量作爲字符串而不是整數,但有沒有辦法強制呢? – user3198443

回答

2

當你通過將「2」裏面它像這樣創建變量:

<xsl:variable name="i">2</xsl:variable> 

創建result tree fragment

如果你創建這樣的:

<xsl:variable name="i" select="2"/> 

這是一個實際的數量和可用於像您在謂詞中使用它。

xsl:value-of ...

  • 根據您的數據,使用測試flags屬性可能不是很準確的幾點說明。如果flags可以有多個值,請考慮使用tokenize()
  • 雖然使用child::軸是好的,但並不是絕對必要的。

例子:

<xsl:value-of select="rules/rule[tokenize(@flags,'\s+')='b'][$i]/@width"/> 
0

變量,你必須使用

<xsl:value-of select="child::rules/rule[contains(@flags, 'b')][position() = $i]/@width"/> 
+0

好吧,但這是絕對位置,還是在具有@標誌= b標準的節點內的位置? – user3198443

+0

它是包含@標誌= b的規則的絕對位置。 – Rupesh