XSLT 在特定位置添加元素

XSLT add element at specific position

我想按如下方式转换 XML 文件:

这是我的主要原创XML文件:

<persons>
  <child name="child1"></child>
  <adult name="adult1"></adult>
  <child name="child2"></child>
  <child name="child3"></child>
  <COMMAND type="INSERT" file="otherchilds.xml"/>
  <adult name="adult2"></adult>
  <adult name="adult3"></adult>
</persons>

并且可能有 XML 文件,只要在主 XML 文件中有一个带有属性 "INSERT" 的标记 COMMAND,XSLT 就应该导入这些文件。 我必须使用 XSLT 1.0

otherchilds.xml:

<childs>
  <child name="child4"></child>
  <child name="child5"></child>
<childs>

两个 XML 文件应该转换为一个 XML 文件:

<root>
  <children>
    <child1></child1>
    <child2></child2>
    <child3></child3>
    <child4></child4>
    <child5></child5>
  </children>
  <persons>
    <child name="child1"></child>
    <adult name="adult1"></adult>
    <child name="child2"></child>
    <child name="child3"></child>
    <child name="child4"></child>
    <child name="child5"></child>
    <adult name="adult2"></adult>
    <adult name="adult3"></adult>
  </persons>
</root>

所以只要找到child,就应该将其添加到children元素中。

使用 XSLT 代码

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

    <xsl:output indent="yes"/>

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

    <xsl:template match="persons">
        <children>
            <xsl:apply-templates select="child" mode="el"/>
        </children>
        <xsl:call-template name="identity"/>
    </xsl:template>

    <xsl:template match="child" mode="el">
        <xsl:element name="{@name}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:transform>

输入

<persons>
  <child name="child1"></child>
  <adult name="adult1"></adult>
  <child name="child2"></child>
  <child name="child3"></child>
  <adult name="adult2"></adult>
  <adult name="adult3"></adult>
</persons>

转化为结果

<?xml version="1.0" encoding="utf-8"?>
<children>
   <child1/>
   <child2/>
   <child3/>
</children>
<persons>

   <child name="child1"/>

   <adult name="adult1"/>

   <child name="child2"/>

   <child name="child3"/>

   <adult name="adult2"/>

   <adult name="adult3"/>

</persons>

在线示例 http://xsltransform.net/bnnZVR

至于需要从第二个文件中加载额外元素的更改要求,代码可以更改为

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

    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="persons">
        <children>
            <xsl:apply-templates select="child | document(COMMAND[@type = 'INSERT']/@file)//child" mode="el"/>
        </children>
        <xsl:call-template name="identity"/>
    </xsl:template>

    <xsl:template match="child" mode="el">
        <xsl:element name="{@name}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="COMMAND[@type = 'INSERT'][@file]">
      <xsl:apply-templates select="document(@file)//child"/>
    </xsl:template>

</xsl:transform>

处理那个特殊情况。