带属性的递归XSLT转换

本文关键字:XSLT 转换 递归 属性 | 更新日期: 2023-09-27 17:53:24

使用以下XML:

<Sections><Section Type="Type1" Text="blabla1"><Section Type="Type2" Text="blabla2"/>  </Section></Sections>

我想产生以下输出:

<Sections><Type1 Text="blabla1"><Type2 Text="blabla2"/></Type1></Sections>

我玩XSLT已经好几个小时了,我甚至不知道从什么开始…有很多关于XLST转换的好例子,但是我仍然缺少一些关于递归和使用Type属性来创建节点的东西。如何将文档中的任何节节点转换为其相应的类型属性?

任何类似的教程,xslt资源或任何可以开始的东西都会很棒

谢谢

带属性的递归XSLT转换

这是如何(根据评论的要求,修改为双向转换):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <!-- Prevent Type attributes from being copied to the output-->
  <xsl:template match="@Type" />
  <!-- Convert <Section Type="Nnn" ... /> into <Nnn ... /> -->
  <xsl:template match="Section">
    <xsl:element name="{@Type}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>
  <!-- Convert <Nnn .... /> into <Section Type="Nnn" ... /> -->
  <xsl:template match="Sections//*[not(self::Section)]">
    <Section Type="{name()}">
      <xsl:apply-templates select="@* | node()" />
    </Section>
  </xsl:template>
</xsl:stylesheet>

运行第一个示例时的输出:

<Sections>
  <Type1 Text="blabla1">
    <Type2 Text="blabla2" />
  </Type1>
</Sections>

运行第二个示例时的输出:

<Sections>
  <Section Type="Type1" Text="blabla1">
    <Section Type="Type2" Text="blabla2" />
  </Section>
</Sections>