XSLT在特定位置添加元素

时间:2015-11-05 13:47:56

标签: xml xslt transformation

我想将XML文件转换为:

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

Lock(_observableCollection)
{
       //Perform update either with add or range. 
}

并且可能存在XML文件,只要在主XML文件中存在具有属性“INSERT”的标记COMMAND,就应该由XSLT导入。 我必须使用XSLT 1.0

otherchilds.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文件:

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

因此,无论何时找到孩子,都应该将其添加到children元素中。

1 个答案:

答案 0 :(得分:0)

使用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>

处理该特定情况。