您好我有以下输入
<Root>
<A rename="yes"/>
<B rename="no"/>
<C rename="no"/>
<D rename="yes"/>
<E rename="no"/>
<F all="yes"/>
</Root>
目前我在<A>
,我希望在@rename="yes"
的元素上应用模板,该元素在元素<F>
之前。
我正在尝试做类似的事情:
<xsl:apply-templates select=
"following-sibling::*[@all='yes']/preceding-sibling::node()[@rename='yes'" />
但我没有得到预期的输出。请建议。
答案 0 :(得分:4)
目前我在
<A>
并且我想要 在其元素上应用模板@rename="yes"
,即将到来 元素<F>
你想要这个XPath表达式(假设A
只有一个名为F
的兄弟姐妹:
following-sibling::F/preceding-sibling::*[@rename='yes'][1]
它选择rename
属性值为"yes"
的任何元素,这是任何后续兄弟(当前节点)元素F
的第一个这样的先前兄弟。
这是一个完整的XSLT转换:
<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:template match="A">
<xsl:apply-templates mode="found" select=
"following-sibling::F/preceding-sibling::*[@rename='yes'][1]"/>
</xsl:template>
<xsl:template match="*" mode="found">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<Root>
<A rename="yes"/>
<B rename="no"/>
<C rename="no"/>
<D rename="yes"/>
<E rename="no"/>
<F all="yes"/>
</Root>
产生了想要的正确结果:
<D rename="yes"/>