在当前节点的以下兄弟的前兄弟上应用模板

时间:2011-06-01 13:22:06

标签: xslt

您好我有以下输入

<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'" />

但我没有得到预期的输出。请建议。

1 个答案:

答案 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"/>