【发布时间】:2021-07-09 06:26:34
【问题描述】:
我有两个要合并的具有相同值的 xml 文件。我想根据 SystemId 和 Title 的值将第二个文件的内容合并到第一个文件中。
第一个文件:
<Package>
<Descriptive>
<Unit id="Id_1502037">
<Content>
<Description>Description 1</Description>
<SystemId>1502037</SystemId>
</Content>
<Unit id="Id_Comp_1502037">
<Content>
<Description>Description 1.1</Description>
</Content>
</Unit>
</Unit>
<Unit id="Id_1502043">
<Content>
<Description>Description 2</Description><SystemId>1502043</SystemId>
</Content>
<Unit id="Id_Comp_1502043">
<Content>
<Description>Description 2.1</Description>
</Content>
</Unit>
</Unit>
</Descriptive>
</Package>
第二个文件:
<Package>
<Descriptive>
<Unit id="ID10">
<Content>
<Description>Description 1.2</Description>
<Title>1502037</Title>
</Content>
</Unit>
<Unit id="ID20">
<Content>
<Description>Description 2.2</Description>
<Title>1502043</Title>
</Content>
</Unit>
</Descriptive>
</Package>
想要的结果:
<Package>
<Descriptive>
<Content>
<Description>Description 1</Description>
<SystemId>1502037</SystemId>
</Content>
<Unit id="Id_Comp_1502037">
<Content>
<Description>Description 1.1</Description>
</Content>
</Unit>
<Unit id="ID10">
<Content>
<Description>Description 1.2</Description>
<Title>1502037</Title>
</Content>
</Unit>
<Content>
<Description>Description 2</Description>
<SystemId>1502043</SystemId>
</Content>
<Unit id="Id_Comp_1502043">
<Content>
<Description>Description 2.1</Description>
</Content>
</Unit>
<Unit id="ID20">
<Content>
<Description>Description 2.2</Description>
<Title>1502043</Title>
</Content>
</Unit>
</Descriptive>
</Package>
我编写了以下 XSLT ($ressource = file2.xml):
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Descriptive">
<xsl:element name="Descriptive">
<xsl:for-each select="Unit">
<xsl:variable name="ids" select="Content/SystemId"/>
<xsl:copy-of select="*"/>
<xsl:for-each select="$ressource/Package/Descriptive/Unit/Content/Title[. = $ids]">
<xsl:copy-of select="$ressource/Package/Descriptive/Unit"/>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:template>
几乎是对的,但结果重复了第二个文件的所有节点。有任何想法吗?谢谢!
【问题讨论】:
-
请始终说明您使用的是哪个 XSLT 版本 - 它通常会影响答案。