我希望在第一次销售和下一次销售之间获得所有元素。 初始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) < 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) < number(6))]
输出:
<Discount SeqNo="2"/>
<Coupon SeqNo="4"/>
<CouponDetail SeqNo="5"/>
我缺少什么? 任何帮助表示赞赏。
答案 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 < $end_seq_no]"/>