gpt4 book ai didi

XSLT : Merge duplicate scenario

转载 作者:行者123 更新时间:2023-12-02 11:41:49 24 4
gpt4 key购买 nike

我有一个像这样的 XML

<ContractInfo  ContractNo="12345">
<Details LastName="Goodchild">
<Filedata FileName="File1"/>
</Details>
</ContractInfo>

<ContractInfo ContractNo="12345">
<Details LastName="Goodchild">
<Filedata FileName="File2"/>
</Details>
</ContractInfo>

<ContractInfo ContractNo="123456">
<Details LastName="Goodchild">
<Filedata FileName="File2"/>
</Details>
</ContractInfo>

我希望我的输出 XML 是这样的

<ContractInfo  ContractNo="12345">
<Details LastName="Goodchild">
<Filedata FileName="File1"/>
<Filedata FileName="File2"/>
</Details>
</ContractInfo>

<ContractInfo ContractNo="123456">
<Details LastName="Goodchild">
<Filedata FileName="File2"/>
</Details>
</ContractInfo>

这里,与匹配“contractNo”相关的“FileData”需要在输出处组合。这种转换可以用 XSLT 来实现吗?

提前致谢。

斯里尼

最佳答案

以下 XSLT 1.0 转换会产生正确的结果:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes" />

<xsl:key name="contract" match="ContractInfo" use="@ContractNo" />
<xsl:key name="filedata" match="Filedata" use="../../@ContractNo" />

<xsl:template match="ContractInfo">
<xsl:if test="generate-id() =
generate-id(key('contract', @ContractNo)[1])">
<xsl:copy>
<xsl:apply-templates select="key('contract', @ContractNo)/Details | @*" />
</xsl:copy>
</xsl:if>
</xsl:template>

<xsl:template match="Details">
<xsl:if test="generate-id(..) =
generate-id(key('contract', ../@ContractNo)[1])">
<xsl:copy>
<xsl:apply-templates select="key('filedata', ../@ContractNo) | @*" />
</xsl:copy>
</xsl:if>
</xsl:template>

<!-- copy everything else (root node, Filedata nodes and @attributes) -->
<xsl:template match="* | @*">
<xsl:copy>
<xsl:apply-templates select="* | @*" />
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

请注意将 <xsl:key>generate-id() 结合使用来标识匹配节点集的第一个节点,从而有效地将相等的节点分组在一起。

您可以通过在 <xsl:sort> 中使用 <xsl:apply-templates> 来强制排序结果。为了清楚起见,我没有将其包括在内。

我的测试输出是:

<root>
<ContractInfo ContractNo="12345">
<Details LastName="Goodchild">
<Filedata FileName="File1"></Filedata>
<Filedata FileName="File2"></Filedata>
</Details>
</ContractInfo>
<ContractInfo ContractNo="123456">
<Details LastName="Goodchild">
<Filedata FileName="File2"></Filedata>
</Details>
</ContractInfo>
</root>

关于XSLT : Merge duplicate scenario,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/645652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com