消除节点内的重复项并在 XSLT 中复制完整的 XML 结构
Eliminate duplicate within nodes and copy complete XML structure in XSLT
我有一个示例消息,我需要在其中删除派对块中的重复项。
示例消息是
<document>
<body>
<party>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909090</gtin>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
</row>
</attrGroupMany>
</pos>
</party>
<party>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909091</gtin>
<attr name="temperatureCode">STORAGE1</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">STORAGE1</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
</row>
</attrGroupMany>
</pos>
</party>
</body>
</document>
预期输出是
<document>
<body>
<party>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909090</gtin>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
</row>
</attrGroupMany>
</pos>
</party>
<party>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909091</gtin>
<attr name="temperatureCode">STORAGE1</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
</row>
</attrGroupMany>
</pos>
</party>
</body>
</document>
如您所见,温度代码 STORAGE 和 STORAGE1 的重复项已被删除。
我正在使用以下 XSLT。它仅从参与方的第一个节点中删除重复项,但不完全处理第二个节点。我使用的 XSLT 是
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="/document/body">
<xsl:element name="body">
<xsl:for-each select="party">
<xsl:element name="party">
<xsl:for-each select="pos">
<xsl:element name="pos">
<xsl:if test="attrGroupMany[@name = 'temperatureInformation']">
<xsl:apply-templates select="attrGroupMany[@name = 'temperatureInformation']/row[generate-id() = generate-id(key('group', concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])))]"/>
</xsl:if>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
<xsl:key name="group" match="attrGroupMany[@name = 'temperatureInformation']/row"
use="concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请让我知道我在 XSLT 中哪里出错了
修改你的代码可以试试
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:key name="group" match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row"
use="concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="attrGroupMany[@name = 'temperatureInformation']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="row[generate-id() = generate-id(key('group', concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
因为您似乎想在检查 "duplicates" 时忽略 <gtin>1000909090</gtin>
请注意,上面的样式表只是根据 attr[@name = 'temperatureCode']
复制第一个确定的 "duplicate" 和attrQualMany[@name = 'temperature']
在单个 pos
内,如果还有其他 row
与其他 gtin
子元素或其他子元素,这些将不会被复制到结果中。
我有一个示例消息,我需要在其中删除派对块中的重复项。
示例消息是
<document>
<body>
<party>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909090</gtin>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
</row>
</attrGroupMany>
</pos>
</party>
<party>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909091</gtin>
<attr name="temperatureCode">STORAGE1</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">STORAGE1</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
</row>
</attrGroupMany>
</pos>
</party>
</body>
</document>
预期输出是
<document>
<body>
<party>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909090</gtin>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
</row>
</attrGroupMany>
</pos>
</party>
<party>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909091</gtin>
<attr name="temperatureCode">STORAGE1</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
</row>
</attrGroupMany>
</pos>
</party>
</body>
</document>
如您所见,温度代码 STORAGE 和 STORAGE1 的重复项已被删除。
我正在使用以下 XSLT。它仅从参与方的第一个节点中删除重复项,但不完全处理第二个节点。我使用的 XSLT 是
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="/document/body">
<xsl:element name="body">
<xsl:for-each select="party">
<xsl:element name="party">
<xsl:for-each select="pos">
<xsl:element name="pos">
<xsl:if test="attrGroupMany[@name = 'temperatureInformation']">
<xsl:apply-templates select="attrGroupMany[@name = 'temperatureInformation']/row[generate-id() = generate-id(key('group', concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])))]"/>
</xsl:if>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
<xsl:key name="group" match="attrGroupMany[@name = 'temperatureInformation']/row"
use="concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请让我知道我在 XSLT 中哪里出错了
修改你的代码可以试试
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:key name="group" match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row"
use="concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="attrGroupMany[@name = 'temperatureInformation']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="row[generate-id() = generate-id(key('group', concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
因为您似乎想在检查 "duplicates" 时忽略 <gtin>1000909090</gtin>
请注意,上面的样式表只是根据 attr[@name = 'temperatureCode']
复制第一个确定的 "duplicate" 和attrQualMany[@name = 'temperature']
在单个 pos
内,如果还有其他 row
与其他 gtin
子元素或其他子元素,这些将不会被复制到结果中。