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

时间:2015-04-05 20:20:11

标签: xml xslt xslt-1.0

我有一个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">)节点。

有可能吗?

1 个答案:

答案 0 :(得分:1)

一种解决方案是遵循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>

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

为此次转化保存Demo