XSLT follow-sibling输出不如预期

时间:2013-07-31 18:29:41

标签: xml xslt xml-parsing

我希望在第一次销售和下一次销售之间获得所有元素。 初始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"/>

我缺少什么? 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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]"/>