最近的兄弟姐妹回到了某种状态

时间:2012-01-02 16:42:05

标签: xslt xpath

<product id="456">
<product id="457" defective="yes">
<product id="458">
<product id="459">
<product id="460" defective="yes">

当上下文节点是产品460时,我需要遍历它并且先前兄弟回到(但不包括)最后一个有缺陷的节点。也就是说,我需要一个for-each on products 458,459和460,但不需要457或之前。

不能假设我到上下文节点按顺序遍历所有产品。

1 个答案:

答案 0 :(得分:2)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kPreceding" match="product" use=
 "generate-id(
     (self::product|following-sibling::product)
                           [@defective='yes'][1]
              )"/>

 <xsl:template match="product[last()]">
     <xsl:copy-of select="key('kPreceding', generate-id())"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML (更正为格式正确!!!):

<t>
    <product id="456"/>
    <product id="457" defective="yes"/>
    <product id="458"/>
    <product id="459"/>
    <product id="460" defective="yes"/>
</t>

生成想要的正确结果

<product id="458"/>
<product id="459"/>
<product id="460" defective="yes"/>

<强>解释

使用密钥根据第一个有缺陷的第一个兄弟generate-id()的{​​{1}}索引任何产品(或者自我,如果此product本身有缺陷)。