1

我正在尝试找到一种方法,用树中更深处的同名节点替换节点。例如,使用以下输入:

<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,顺便说一句。

谢谢,马克

4

1 回答 1

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>
于 2012-02-28T18:15:35.240 回答