为具有多个值的节点删除 XSLT 中的重复项
Removing duplicate in XSLT for node having multiple value
我有一个样本 XML,它有重复的节点。低于温度代码的节点 1 和节点 3 以及 FAH 和 CC 中的两个值都是重复的。
需要检查行节点内的所有值以将其称为重复节点
<row>
<attr name="temperatureCode">STORADE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
此示例消息是
<document>
<party>
<gtin>1000909090</gtin>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<attr name="temperatureCode">STORADE</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>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">STORADE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">DUMMY</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
</attrGroupMany>
</pos>
</party>
</document>
当我应用下面的 XSLT 时,它起作用了,并且删除了重复的节点。我使用的 XSLT 是
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="dummy" match="row" use="concat(attr[@name = 'temperatureCode'], '-', attrQualMany/value/@qual)"/>
<xsl:template match="document">
<CatalogItem>
<RelationshipData>
<Relationship>
<RelationType>temperatureInformation_details</RelationType>
<RelatedItems>
<xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row[generate-id() = generate-id(key('dummy', concat(attr[@name = 'temperatureCode'], '-', attrQualMany/value/@qual) ))]">
<RelatedItem>
<xsl:attribute name="referenceKey">
<xsl:value-of select="concat('temperatureInformation_details','-',attr[@name='temperatureCode'],'-',attrQualMany/@name,'-',attrQualMany/value/@qual,'-',attrQualMany/value,'-', position() )"/>
</xsl:attribute>
</RelatedItem>
</xsl:for-each>
</RelatedItems>
</Relationship>
</RelationshipData>
</CatalogItem>
</xsl:template>
</xsl:stylesheet>
但它只检查 attrQualMany name="temperature" 中的第一个值,而不检查 attrQualMany 下的两个值。
如果示例消息如下所示并且它不起作用。它应该在输出中给我 4 条记录,但它给了我 3 条记录。
<document>
<party>
<gtin>1000909090</gtin>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<attr name="temperatureCode">STORADE</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>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">STORADE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
**<value qual="CC">30</value>**
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">DUMMY</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
</attrGroupMany>
</pos>
</party>
</document>
正确的预期输出是
<?xml version="1.0" encoding="UTF-8"?>
<CatalogItem>
<RelationshipData>
<Relationship>
<RelationType>temperatureInformation_details</RelationType>
<RelatedItems>
<RelatedItem referenceKey="temperatureInformation_details-STORADE-temperature-FAH-10-1" />
<RelatedItem referenceKey="temperatureInformation_details-HANDLING-temperature-FAH-10-2" />
<RelatedItem referenceKey="temperatureInformation_details-STORADE-temperature-FAH-10-3" />
<RelatedItem referenceKey="temperatureInformation_details-DUMMY-temperature-FAH-10-4" />
</RelatedItems>
</Relationship>
</RelationshipData>
</CatalogItem>
有任何意见,请告诉我
如果要按三个值分组,则必须在键中显式枚举所有三个值:
<xsl:key name="grp" match="row" use="concat(attr[@name='temperatureCode'], '|', attrQualMany/value[@qual='FAH'], '|', attrQualMany/value[@qual='CC'])"/>
我怀疑这可以缩短为:
<xsl:key name="grp" match="row" use="concat(attr, '|', attrQualMany/value[@qual='FAH'], '|', attrQualMany/value[@qual='CC'])"/>
已添加:
The data can be changed under <attrQualMany name="temperature">
both
for qual and its value. So I cannot hardcode to check the qual="FAH"
or qual="CC". Is there any generic way without hardcoding the vaues.
如果 - 且仅当 - attrQualMany
的结构对于已处理文档中的所有行都是相同的,您可以将您的键定义为:
<xsl:key name="grp" match="row" use="concat(attr[@name='temperatureCode'], '|', attrQualMany[@name='temperature'])"/>
“相同结构”我的意思是每一行attrQualMany
包含相同的value
children,具有相同的qual
属性,按相同顺序列出。
如果上述条件不成立,您将不得不分两个阶段处理文档:首先,将您要分组的所有值连接成一个文本值;然后按连接值对结果 node-set 进行分组。
我有一个样本 XML,它有重复的节点。低于温度代码的节点 1 和节点 3 以及 FAH 和 CC 中的两个值都是重复的。 需要检查行节点内的所有值以将其称为重复节点
<row>
<attr name="temperatureCode">STORADE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
此示例消息是
<document>
<party>
<gtin>1000909090</gtin>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<attr name="temperatureCode">STORADE</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>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">STORADE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">DUMMY</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
</attrGroupMany>
</pos>
</party>
</document>
当我应用下面的 XSLT 时,它起作用了,并且删除了重复的节点。我使用的 XSLT 是
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="dummy" match="row" use="concat(attr[@name = 'temperatureCode'], '-', attrQualMany/value/@qual)"/>
<xsl:template match="document">
<CatalogItem>
<RelationshipData>
<Relationship>
<RelationType>temperatureInformation_details</RelationType>
<RelatedItems>
<xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row[generate-id() = generate-id(key('dummy', concat(attr[@name = 'temperatureCode'], '-', attrQualMany/value/@qual) ))]">
<RelatedItem>
<xsl:attribute name="referenceKey">
<xsl:value-of select="concat('temperatureInformation_details','-',attr[@name='temperatureCode'],'-',attrQualMany/@name,'-',attrQualMany/value/@qual,'-',attrQualMany/value,'-', position() )"/>
</xsl:attribute>
</RelatedItem>
</xsl:for-each>
</RelatedItems>
</Relationship>
</RelationshipData>
</CatalogItem>
</xsl:template>
</xsl:stylesheet>
但它只检查 attrQualMany name="temperature" 中的第一个值,而不检查 attrQualMany 下的两个值。
如果示例消息如下所示并且它不起作用。它应该在输出中给我 4 条记录,但它给了我 3 条记录。
<document>
<party>
<gtin>1000909090</gtin>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<attr name="temperatureCode">STORADE</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>
<value qual="CC">20</value>
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">STORADE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
**<value qual="CC">30</value>**
</attrQualMany>
</row>
<row>
<attr name="temperatureCode">DUMMY</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
</row>
</attrGroupMany>
</pos>
</party>
</document>
正确的预期输出是
<?xml version="1.0" encoding="UTF-8"?>
<CatalogItem>
<RelationshipData>
<Relationship>
<RelationType>temperatureInformation_details</RelationType>
<RelatedItems>
<RelatedItem referenceKey="temperatureInformation_details-STORADE-temperature-FAH-10-1" />
<RelatedItem referenceKey="temperatureInformation_details-HANDLING-temperature-FAH-10-2" />
<RelatedItem referenceKey="temperatureInformation_details-STORADE-temperature-FAH-10-3" />
<RelatedItem referenceKey="temperatureInformation_details-DUMMY-temperature-FAH-10-4" />
</RelatedItems>
</Relationship>
</RelationshipData>
</CatalogItem>
有任何意见,请告诉我
如果要按三个值分组,则必须在键中显式枚举所有三个值:
<xsl:key name="grp" match="row" use="concat(attr[@name='temperatureCode'], '|', attrQualMany/value[@qual='FAH'], '|', attrQualMany/value[@qual='CC'])"/>
我怀疑这可以缩短为:
<xsl:key name="grp" match="row" use="concat(attr, '|', attrQualMany/value[@qual='FAH'], '|', attrQualMany/value[@qual='CC'])"/>
已添加:
The data can be changed under
<attrQualMany name="temperature">
both for qual and its value. So I cannot hardcode to check the qual="FAH" or qual="CC". Is there any generic way without hardcoding the vaues.
如果 - 且仅当 - attrQualMany
的结构对于已处理文档中的所有行都是相同的,您可以将您的键定义为:
<xsl:key name="grp" match="row" use="concat(attr[@name='temperatureCode'], '|', attrQualMany[@name='temperature'])"/>
“相同结构”我的意思是每一行attrQualMany
包含相同的value
children,具有相同的qual
属性,按相同顺序列出。
如果上述条件不成立,您将不得不分两个阶段处理文档:首先,将您要分组的所有值连接成一个文本值;然后按连接值对结果 node-set 进行分组。