2009-12-23 196 views
0

我有一個包含兩個組相關的值的一個xml:XPath。基於一個其它相關節點上選擇節點

<Rows> 
    <!-- first group --> 
    <Row> 
     <Sequence>100</Sequence> 
     <Value>+</Value> 
    </Row> 
    <Row> 
     <Sequence>105</Sequence> 
     <Value>+</Value> 
    </Row>  
    <Row> 
     <Sequence>110</Sequence> 
     <Value>-</Value> 
    </Row> 
    <!-- second group --> 
    <Row> 
     <Sequence>150</Sequence> 
     <Value>20</Value> 
    </Row> 
    <Row> 
     <Sequence>155</Sequence> 
     <Value>15</Value> 
    </Row>  
    <Row> 
     <Sequence>160</Sequence> 
     <Value>90</Value> 
    </Row>  
</Rows> 

與第二組的元件第一組中的每個元素:序列 - >序列+ 50

我需要從第二組中獲得節點集合,第一組中的相關節點包含+符號(節點序列爲150和155)。

未來的排序和枚舉需要這些節點。

/Rows/Row[contains(/Rows/Row[Sequence = (./Sequence - 50)]/Value, '+')] 

我試圖以上的XPath,但未能作爲./被引用到當前上下文(內第二托架),但我需要訪問到母體一個(第一括號內)。

有人知道有解決方案嗎?

此致,Aikin

P.S.使用子字符串(./ Sequence - 50,1,3)獲取

+0

你需要選擇什麼? – 2009-12-23 16:04:51

+0

我需要從第二組中獲得節點集合,其中第一組中的相關節點包含+符號(節點序列爲150和155)。 – Aikin 2009-12-24 07:10:47

回答

1

只要打開查詢倒掛:

/Rows/Row[/Rows/Row[contains(Value, '+')]/Sequence = Sequence - 50] 

另外值得一提的是,xsl:key可能有用這裏來加快速度。

+0

非常感謝!明天晚些時候纔會改變主意:) – Aikin 2009-12-24 07:01:04

1

XPath/XSLT中的上下文節點(.)與當前節點(current())之間存在區別。另請參閱此相關的問題:

Current node vs. Context node in XSLT/XPath?

在您的例子,你就需要使用current()來指代當前節點,例如

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Row"> 
    <Row1> 
     <xsl:copy-of select="."/> 
    </Row1> 
    <Row2> 
     <xsl:copy-of select="/Rows/Row[./Sequence = (current()/Sequence + 50) and current()/Value = '+']"/> 
    </Row2> 
    </xsl:template> 
</xsl:stylesheet> 

上述短XSLT段將每行與相應的行從所述第二組複製到與你在你的問題,得到條件的輸出文件(不同的是50和第一行具有+值)。

+0

感謝* divo *,我已經看過那篇文章。問題是current()節點指向根。是啊,是的,是的,我不知道xslt太多,我是一個必要的程序員。 關於預處理(上面的xsl片段):這是一個解決方法。 – Aikin 2009-12-24 07:09:01

+0

'current()'不受任何你可能寫在XPath中的影響,它受'xsl:apply-templates'和'xsl:for-each'的影響。我相信他的觀點是,你總是可以用'xsl:for-each'(可能是嵌套的)和'xsl:if'重寫一個XPath表達式,然後根據需要使用'current()',將它綁定到變量,等等 – 2009-12-24 16:37:01