2016-02-11 120 views
0

我有一個示例XML這樣,XSLT - 通過比較其它元素的副本屬性屬性

<doc> 
    <aa type="aaa" id="ggg">text</aa> 
    <aa type="bbb" id="hhh">text</aa> 
    <aa type="ccc" id="iii">text</aa> 
    <aa type="ccc" id="jjj">text</aa> 
    <aa type="bbb" id="kkk">text</aa> 
    <aa type="aaa" id="lll">text</aa> 
</doc> 

正如你可以看到有2個元素等於type這裏屬性,我需要的是互換id屬性存在什麼值如果type屬性相等的元素。

因此,對於上面的例子中,輸出應該是,

<doc> 
    <aa type="aaa" id="lll">text</aa> 
    <aa type="bbb" id="kkk">text</aa> 
    <aa type="ccc" id="jjj">text</aa> 
    <aa type="ccc" id="iii">text</aa> 
    <aa type="bbb" id="hhh">text</aa> 
    <aa type="aaa" id="ggg">text</aa> 
</doc> 

我寫了下面的xsl要做到這一點,

<xsl:template match="aa[@type='aaa' or @type='bbb' or @type='ccc'][1]"> 
     <xsl:copy> 
      <xsl:if test="following::aa[@type=self::node()/@type]"> 
       <xsl:attribute name="id"> 
        <xsl:value-of select="following::aa[@type=self::node()/@type]/@type"/> 
       </xsl:attribute> 
      </xsl:if> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="aa[@type='aaa' or @type='bbb' or @type='ccc'][2]"> 
     <xsl:copy> 
      <xsl:if test="following::aa[@type=self::node()/@type]"> 
       <xsl:attribute name="id"> 
        <xsl:value-of select="preceding::aa[@type=self::node()/@type]/@type"/> 
       </xsl:attribute> 
      </xsl:if> 
     </xsl:copy> 
    </xsl:template> 

但是這並不如預期,任何人建議我一個方法我怎樣才能使用XSLT做到這一點?

回答

1

試試這個

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="aa"> 
     <xsl:variable name="type" select="@type"/> 
     <xsl:copy> 
      <xsl:apply-templates select="@type"/> 
      <xsl:choose> 
       <xsl:when test="following::aa[@type=$type]"> 
        <xsl:attribute name="id"> 
         <xsl:value-of select="following::aa[@type=$type]/@id"/> 
        </xsl:attribute> 
       </xsl:when> 
       <xsl:when test="preceding::aa[@type=$type]"> 
        <xsl:attribute name="id"> 
         <xsl:value-of select="preceding::aa[@type=$type]/@id"/> 
        </xsl:attribute> 
       </xsl:when> 
      </xsl:choose> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet>