2011-06-01 108 views
2

您好我有如下输入在当前节点的下列兄弟的前同辈应用模板

<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

所以你想用'@ rename = yes'将模板应用于所有元素?你期待什么输出? – 2011-06-01 13:31:48

+0

我只想控制',它可以是任何元素,基本上这个元素的属性是@ @ rename ='yes'“,后面跟着''。 – Dip 2011-06-01 13:34:25

+0

问题中的输入结构不正确。 – 2011-06-01 13:35:40

回答

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"/> 
+0

谢谢一个地段Dimitre。有效。 :)我在正确的轨道附近,但你在正确的轨道上对我。 :-) – Dip 2011-06-01 13:43:31

+0

+1,我得到了什么OP请求只是看着你的答案:) – 2011-06-01 13:44:23

+0

@Dip:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – 2011-06-01 13:58:27