2013-07-31 49 views
1

我想獲得第一個銷售和下一個銷售之間的所有元素。 初始XMLXSLT跟隨 - 兄弟姐妹輸出不如預期

<Parent> 
    <Sale SeqNo="1"/> 
    <Discount SeqNo="2"/> 
    <Coupon SeqNo="4"/> 
    <CouponDetail SeqNo="5"/> 
    <Sale SeqNo="6"/> 
    <Sale SeqNo="7"/> 
    <Sale SeqNo="8"/> 
    <Payment SeqNo="9"/> 
</Parent> 

期望中的XML:

<Discount SeqNo="2"/> 
<Coupon SeqNo="4"/> 
<CouponDetail SeqNo="5"/> 

我公司目前有以下申請模板

following-sibling::*[(number(@SeqNo) &lt; number(following::Sale[1]/@SeqNo))] 

輸出我目前得到:

<Discount SeqNo="2"/> 
<Coupon SeqNo="4"/> 
<CouponDetail SeqNo="5"/> 
<Sale SeqNo="6"/> 
<Sale SeqNo="7"/> 
<Sale SeqNo="8"/> 
<Payment SeqNo="9"/> 

我F I在未來的銷售項目的序列號硬編碼,我得到正確的輸出

following-sibling::*[(number(@SeqNo) &lt; number(6))] 

輸出:

<Discount SeqNo="2"/> 
<Coupon SeqNo="4"/> 
<CouponDetail SeqNo="5"/> 

我在想什麼? 任何幫助表示讚賞。

回答

3

的問題是,你的謂詞是被評估的情況下 - 這是那正在爲是否應該被包含在最終的節點集測試Parent特定的子元素。因此,在這種情況下,following::Sale[1]會爲您提供繼測試元素後的第一個Sale元素,該元素始終具有更高的@SeqNo,即使它本身是Sale元素。

你需要做的是存儲在一個做你的選擇,例如xsl:variable之前,感興趣的序列號:

<xsl:variable name="end_seq_no" select="following-sibling::Sale[1]/@SeqNo"/> 
<xsl:apply-templates select="following-sibling::*[@SeqNo &lt; $end_seq_no]"/> 
+1

或者,如果你不想讓變量,使用'電流()'從以下謂詞中訪問外部上下文:'following-sibling :: * [@ SeqNo < current()/ following-sibling :: Sale [1]/@ SeqNo]' –

+0

@IanRoberts我甚至無法看到該函數在[XPath 3]中(http://www.w3.org/TR/xpath-functions-30/)。它在哪裏定義? – Jonathan

+1

'current()'函數是XSLT規範的一部分,而不是xpath規範。 –