我正在尝试编写一个 XSLT,当重复的 ITEM 段具有相同的子节点值时,它将删除该段。例如,在 ITEM 下,我给出了 6 个字段,但有可能会出现几个空标签或带有值的字段。我该如何以通用方式在 XSLT 中声明这一点?我们可以使用前面的同级函数在 BXYI 段下查找相同的 ITEM 段并将其删除吗?还是我需要定义所有可能的字段?请检查一次,还有我的 xslt 代码,它首先不会删除重复的 ITEM 段。
输入样本
<?xml version="1.0" encoding="UTF-8"?>
<D02X001>
<DOC BEGIN="1">
<DC40 SEGMENT="1">
<NAM>DC40</NAM>
</DC40>
<BXYH SEGMENT="1">
<LDAT>date</LDAT>
<UDAT>date1</UDAT>
<BXYI SEGMENT="1">
<TNR>123453</TNR>
<ORT>1000</ORT>
<ITEM SEGMENT="1">
<N11>6789</N11>
<AR>03</AR>
<PQC>NU</PQC>
<QTY>90909</QTY>
<NUM/>
<ASCD/>
</ITEM>
<ITEM SEGMENT="1">
<N11>6789</N11>
<AR>03</AR>
<PQC>NU</PQC>
<QTY>3456</QTY>
<NUM/>
<ASCD/>
</ITEM>
<ITEM SEGMENT="1">
<N11>6789</N11>
<AR>03</AR>
<PQC>NU</PQC>
<QTY>3456</QTY>
<NUM/>
<ASCD/>
</ITEM>
<ITEM SEGMENT="1">
<N11>6789</N11>
<AR>03</AR>
<PQC>NU</PQC>
<QTY>3456</QTY>
<NUM/>
<ASCD/>
</ITEM>
</BXYI>
</BXYH>
</DOC>
</D02X001>
输出样本
<?xml version="1.0" encoding="UTF-8"?>
<D02X001>
<DOC BEGIN="1">
<DC40 SEGMENT="1">
<NAM>DC40</NAM>
</DC40>
<BXYH SEGMENT="1">
<LDAT>date</LDAT>
<UDAT>date1</UDAT>
<BXYI SEGMENT="1">
<TNR>123453</TNR>
<ORT>1000</ORT>
<ITEM SEGMENT="1">
<N11>6789</N11>
<AR>03</AR>
<PQC>NU</PQC>
<QTY>90909</QTY>
<NUM/>
<ASCD/>
</ITEM>
<ITEM SEGMENT="1">
<N11>6789</N11>
<AR>03</AR>
<PQC>NU</PQC>
<QTY>3456</QTY>
<NUM/>
<ASCD/>
</ITEM>
</BXYI>
</BXYH>
</DOC>
</D02X001>
我使用的 XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="uniqueItems" match="ITEM" use="concat(N11, '-', AR, '-', PQC, '-', QTY)"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="BXYH">
<xsl:copy>
<xsl:apply-templates select="*"/>
<BXYI SEGMENT="1">
<xsl:for-each select="ITEM">
<xsl:if test="generate-id() = generate-id(key('uniqueItems', concat(N11, '-', AR, '-', PQC, '-', QTY))[1])">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</BXYI>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在 XSLT 3 中,你可以使用
composite
分组键来实现这一点,例如完整的 XSLT 如下:
在线拉小提琴。