XSLT使用父名重命名XML标记

时间:2014-02-25 16:45:08

标签: xml xslt

我想更改以下XML:

<command>
    <node>
        <e id="list1">
            <node>
                <e id="01"><key id="value">Value01</key></e>
                <e id="02"><key id="value">Value02</key></e>
            </node>
        </e>
    </node>
    <key>
        <e id="11">Value11</e>
        <e id="12">Value12</e>
    </key>
</command>

获取此XML:

<command>
    <node id="list1">
        <node id="01"><key id="value">Value01</key></node>
        <node id="02"><key id="value">Value02</key></node>
    </node>
    <key id="11">Value11</key>
    <key id="12">Value12</key>
</command>

所以有很多问题:

  • 使用父节点名称重命名“e”节点
  • 删除旧的父节点

我尝试了几次转换失败(我是XSLT的初学者)。有没有人有这种转变的解决方案?谢谢!

1 个答案:

答案 0 :(得分:3)

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

然后你想为

添加一个模板
<xsl:template match="*[e]">
  <xsl:apply-templates/>
</xsl:template>

和一个

<xsl:template match="e">
  <xsl:element name="{name(..)}">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

然后是完整的样式表

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

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

<xsl:template match="*[e]">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="e">
  <xsl:element name="{name(..)}">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>