删除一些节点XSLT 1.0

时间:2015-05-05 09:21:42

标签: xslt

根据我在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>

条件是:

  1. IF DROP =“ST”和DROP!=(不等于)“ST”但是相同的样式@id和Col @ id。我们必须只获取包含DROP =“ST”

  2. 的节点的节点
  3. 所有节点如果Col @ id和Style @ id不同。

1 个答案:

答案 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/@idStyle/Col/@codeStyle元素的串联,并检查每个节点是否是与该键关联的第一个节点。 / p>