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>
处理那个特殊情况。
我想按如下方式转换 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>
处理那个特殊情况。