根据我在xslt
的一些经验,我希望得到你的帮助。
我的输入XML
看起来像:
<XML>
<Style id="12">
<Drop>ST</Drop>
<Col Code="277" Description="test" Group="565">
<EAN en="123" si="XS"/>
</Col>
</Style>
<Style id="12">
<Drop>LT</Drop>
<Col Code="277" Description="test" Group="235">
<EAN en="123" si="XL"/>
</Col>
</Style>
<Style id="12">
<Drop>LT</Drop>
<Col Code="276" Description="test" Group="235">
<EAN en="123" si="XL"/>
</Col>
</Style>
<Style id="13">
<Drop>MD</Drop>
<Col Code="276" Description="test" Group="235">
<EAN en="123" si="XL"/>
</Col>
</Style>
</XML>
我想进行转换以获得此输出文件:
<XML>
<Style id="12">
<Drop>ST</Drop>
<Col Code="277" Description="test" Group="565">
<EAN en="123" si="XS"/>
</Col>
</Style>
<Style id="12">
<Drop>LT</Drop>
<Col Code="276" Description="test" Group="235">
<EAN en="123" si="XL"/>
</Col>
</Style>
<Style id="13">
<Drop>MD</Drop>
<Col Code="276" Description="test" Group="235">
<EAN en="123" si="XL"/>
</Col>
</Style>
</XML>
条件是:
IF DROP =“ST”和DROP!=(不等于)“ST”但是相同的样式@id和Col @ id。我们必须只获取包含DROP =“ST”
所有节点如果Col @ id和Style @ id不同。
答案 0 :(得分:0)
这应该产生你需要的输出:
XSLT 1.0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="StyleCol" match="//Style" use="concat(@id, Col/@Code)"/>
<!-- identity transformation -->
<xsl:template match="* | @* | text()">
<xsl:copy>
<xsl:apply-templates select="* | @* | text()"/>
</xsl:copy>
</xsl:template>
<!-- don't copy "duplicated" Style elements -->
<xsl:template match="Style[Drop != 'ST' and generate-id(.) != generate-id(key('StyleCol', concat(@id, Col/@Code)))[1]]"/>
</xsl:stylesheet>
它使用xsl:key
映射Syle/@id
和Style/Col/@code
到Style
元素的串联,并检查每个节点是否是与该键关联的第一个节点。 / p>