1

我想获得第一次销售和下一次销售之间的所有元素。初始 XML

<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"/>

如果我在下一个销售项目的序列号中硬编码,我会得到正确的输出

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

输出:

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

我错过了什么?任何帮助表示赞赏。

4

1 回答 1

3

问题是您的谓词被评估的上下文 - 它Parent是正在测试它的特定元素子元素,以确定它是否应该包含在结果节点集中。因此,在这种情况下,following::Sale[1]为您提供被测试元素之后的第一个元素,即使它本身就是一个元素Sale,它也将始终具有更高的。@SeqNoSale

您需要做的是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]"/>
于 2013-07-31T18:46:16.703 回答