2012-02-28 74 views
1

我试图找到一种方法来替换具有相同名称的树中较深的树。例如,下面的输入:XSLT 2.0:用孙子节点覆盖节点

<root> 
    <foo> 
     <a>1</a> 
     <b>2</b> 
     <c>3</c> 
     <bar> 
      <a>100</a> 
      <c>5000</c> 
     </bar> 
    </foo> 
</root> 

我想产生这样的:

<root> 
    <foo> 
     <a>100</a> 
     <b>2</b> 
     <c>5000</c> 
    </foo> 
</root> 

我需要能够替换任意数量的节点,我也想动态地找出列表,而不是拼出所有的可能性,因为将来有可能会改变事情。另一个要求是父节点的顺序必须保持不变。 (具体来说,我的最终输出将是一个CSV文件,所以列需要与头部对齐。)

这是我第一次尝试学习XSLT,我完全沉迷于此!任何帮助将不胜感激。我正在使用XSLT 2.0,顺便说一句。

谢谢, 马克

回答

0

我的讨厌的臭虫SO不缩进格式的代码道歉!

他们无法修复这个几个月...

这种转变

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

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"*[*] 
     [every $leaf in .//*[not(*)] 
     satisfies 
     name($leaf) = preceding::*/name() 
     ] 
"/> 

<xsl:template match= 
    "*[not(*) and name() = following::*/name()]"> 

    <xsl:sequence select= 
    "following::*[name() = name(current())][1]"/> 
</xsl:template> 
</xsl:stylesheet> 

时所提供的XML文档应用:

<root> 
    <foo> 
     <a>1</a> 
     <b>2</b> 
     <c>3</c> 
     <bar> 
      <a>100</a> 
      <c>5000</c> 
     </bar> 
    </foo> 
</root> 

产生想要的,正确的结果

<root> 
    <foo> 
     <a>100</a> 
     <b>2</b> 
     <c>5000</c> 
    </foo> 
</root> 
+0

圣牛!我不觉得自己无法想象这么糟糕。尽管它很有魅力。非常感谢! – donkey 2012-02-29 14:07:31

+0

@donkey:不客气。 – 2012-02-29 14:20:29

相关问题