<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或之前。
不能假设我到上下文节点按顺序遍历所有产品。
答案 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
本身有缺陷)。