【发布时间】:2020-08-31 14:31:21
【问题描述】:
我正在尝试使用 xslt 和 saxon-HE 9.9.1 .NET 合并特定文件夹中的多个 xml 文件。我需要创建一个通用合并,这样我就不会在模板中添加一个静态标签来将它与不同节点的名称一起使用,我试图在开始时创建一个循环来添加根标签或顶级标签,但它也在 xml 结束之前关闭标签,但顶级标签存在问题 例子: XML 文件 1:
<Arr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Src>
<name>C</name>
<pr>pr</pr>
<par>
<Q>
<isC>false</isC>
<name>hrh1</name>
<type>xx1</typ>
</Q>
</par>
<st />
</Src>
<Src>
<name>C</name>
<pr></pr>
<par>
<Q>
<isC>false</isC>
<name>hrh2</name>
<type>xx2</typ>
</Q>
</par>
<st>
<Src>
<name>st1</name>
<pr>prst1</pr>
<par>
<Q>
<isC>false</isC>
<name>q1</name>
<type>t1</type>
</Q>
<Q>
<isC>false</isC>
<name>q2</name>
<type>t2</type>
</Q>
</par>
<st />
</Src>
</st>
</Src>
</Arr>
XML 文件 2:
<Arr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Src>
<name>CFile2</name>
<pr>C2</pr>
<par>
<Q>
<isC>false</isC>
<name>hrh1</name>
<type>xx1</typ>
</Q>
</par>
<st />
</Src>
</Arr>
预期输出:
<Arr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Src>
<name>C</name>
<pr>pr</pr>
<par>
<Q>
<isC>false</isC>
<name>hrh1</name>
<type>xx1</typ>
</Q>
</par>
<st />
</Src>
<Src>
<name>C</name>
<pr></pr>
<par>
<Q>
<isC>false</isC>
<name>hrh2</name>
<type>xx2</typ>
</Q>
</par>
<st>
<Src>
<name>st1</name>
<pr>prst1</pr>
<par>
<Q>
<isC>false</isC>
<name>q1</name>
<type>t1</type>
</Q>
<Q>
<isC>false</isC>
<name>q2</name>
<type>t2</type>
</Q>
</par>
<st />
</Src>
</st>
</Src>
<Src>
<name>CFile2</name>
<pr>C2</pr>
<par>
<Q>
<isC>false</isC>
<name>hrh1</name>
<type>xx1</typ>
</Q>
</par>
<st />
</Src>
</Arr>
我当前的模板由于顶级标签关闭而产生错误的输出
<?xml version="1.0" encoding="windows-1256"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:user="http://tempuri.org/msxsl" >
<xsl:output method="xml" indent="yes" encoding="windows-1256" />
<xsl:template name="main">
<xsl:for-each select="collection('.?select=*.xml')/*">
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:copy>
<xsl:copy-of select="/*/node()"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="/*/node()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我使用以下命令从 cmd 运行:
transform -it:main -xsl:merge_xml.xslt -o:output.xml
我当前的输出是错误的
<Arr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Src>
<name>C</name>
<pr>pr</pr>
<par>
<Q>
<isC>false</isC>
<name>hrh1</name>
<type>xx1</typ>
</Q>
</par>
<st />
</Src>
<Src>
<name>C</name>
<pr></pr>
<par>
<Q>
<isC>false</isC>
<name>hrh2</name>
<type>xx2</typ>
</Q>
</par>
<st>
<Src>
<name>st1</name>
<pr>prst1</pr>
<par>
<Q>
<isC>false</isC>
<name>q1</name>
<type>t1</type>
</Q>
<Q>
<isC>false</isC>
<name>q2</name>
<type>t2</type>
</Q>
</par>
<st />
</Src>
</st>
</Src>
</Arr>
<Src>
<name>CFile2</name>
<pr>C2</pr>
<par>
<Q>
<isC>false</isC>
<name>hrh1</name>
<type>xx1</typ>
</Q>
</par>
<st />
</Src>
【问题讨论】:
标签: xml xslt tags saxon merge-file