我想将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元素中。
答案 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>
处理该特定情况。