XSLT.将特定类型的所有节点移动到一个节点中



我有一个XML(folderfile节点的数量可能不同):

<root>
  <system>3</system>
  <type>0</type>
  <file name="a"/>
  <folder name="aaa">
    <file name="b"/>
    <file name="c"/>
    <folder name="bbb">
      <file name="d"/>
      ...
    </folder>
    <folder name="ccc">
      <file name="e"/>
      ...
    </folder>
    ...
  </folder>
  ...
</root>

应转换为:

<root>
  <system>3</system>
  <type>0</type>
  <folder name="all_files">
    <file name="a"/>
    <file name="b"/>
    <file name="c"/>
    ...
  </folder>
</root>

我需要使用XSLT来完成,但我有一个问题,我不知道如何将file节点复制到(<folder name="all_files">)节点中。

有可能做到吗?

一个解决方案如下XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
  <xsl:template match="/">
    <root>
        <xsl:apply-templates select="//system | //type" mode="copy" />
        <folder name="all_files">
            <xsl:apply-templates select="//file" mode="copy" />
        </folder>
    </root>
  </xsl:template>
  <xsl:template match="@*|node()" mode="copy">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
</xsl:transform>

应用于您的输入XML,生成以下输出:

<root>
  <system>3</system>
  <type>0</type>
  <folder name="all_files">
    <file>a</file>
    <file>b</file>
    <file>c</file>
    <file>d</file>
    <file>e</file>
  </folder>
</root>

与根级别匹配的模板将模板应用于模式为copysystemtype节点(以防止复制具有与所有节点和属性匹配的模板的所有节点)
然后,封装在<folder name="all_files">中,将相同的模板应用于所有file节点。

已保存此转换的演示。

相关内容

  • 没有找到相关文章

最新更新