2015-05-05 122 views
-2

根据我在xslt中的一些经验,我希望得到您的帮助。 我输入XML样子:删除某些节点XSLT 1.0

<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. 如果drop =” ST“和DROP!=(不等于)”ST“,但是SAME Style @ id和Col @ id。我们必须仅获得包含DROP =“ST”的节点的节点

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

+0

嗨,有什么帮助吗?谢谢 – Abdel

+0

你的条件并不十分清楚:如果Drop =“ST”**和** Drop!=“ST”'有*要做的事情(保留元素?移除元素?),没有多大意义;而'Style/@ id'属性存在时,不存在'Col/@ id';你能否澄清'Style'元素何时必须从输出中消失? – lfurini

+0

嗨,谢谢你的回应!如果条件为真,则必须删除带有重复的元素。 :具有相同Style @ id和Col @ id的DROP =“ST”(例如Style1)和DROP!=(不等于)“ST”(例如对于Style2)。那么Style 2必须消失。如果我们有不同的col @ id od。 Col @ id然后不必删除。非常感谢 – Abdel

回答

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/@code级联映射到Style元件,以及是否每个检查节点是与该密钥关联的第一个节点。