XSLT - 将元素重命名并移动到新节点

时间:2016-06-08 07:09:29

标签: xml xslt

我有以下XML输入文件:

<home>
    <folders>
        <folder uuid="uuid1">
            <name>folder1</name>
            <member ref="refA" />
            <member ref="refB" />
        </folder>
        <folder uuid="uuid2">
            <name>folder2</name>
            <member ref="refC" />
            <member ref="refD" />
        </folder>
        <folder uuid="uuid3">
            <name>folder3</name>
            <member ref="refE" />
            <member ref="refF" />
        </folder>
    </folders>
</home>

我会得到以下树:

<home>
    <folders>
        <folder uuid="uuid1">
            <name>folder1</name>
            <refNews>
                <refNew ref="refA" />
                <refNew ref="refB" />
            </refNews>
        </folder>
        <folder uuid="uuid2">
            <name>folder2</name>
            <refNews>
                <refNew ref="refC" />
                <refNew ref="refD" />
            </refNews>
        </folder>
        <folder uuid="uuid3">
            <name>folder3</name>
            <refNews>
                <refNew ref="refE" />
                <refNew ref="refF" />
            </refNews>
        </folder>
    </folders>
</home>

要恢复:

  • &#34;部件&#34;元素变成&#34; refNew&#34;
  • 所有&#34; refNew&#34;元素包含在新节点&#34; refNews&#34;

我尝试了几个XSLT模板,但我无法在同一个XSLT文件中重命名和移动: - (

我需要你的帮助。

此致 Zido

1 个答案:

答案 0 :(得分:1)

总是更好地了解到目前为止你所拥有的东西,并帮助解决它出错的地方,但实际上这很容易。试试这个:

<xsl:template match="folder">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()[not(self::member)]"/>
    <refNews>
      <xsl:apply-templates select="member"/>
    </refNews>
  </xsl:copy>
</xsl:template>

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

如果您不想要refNews元素,如果没有任何member,您可以将refNews元素包装在<xsl:if test="member"/>中,或者更好,让第一个模板与folder[member]匹配。

这假设您还定义了身份模板。