2016-02-11 7 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 значения, если элементы, где атрибут типа равен.

так, для вышеприведенного примера, выход должен быть,

<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> 
Смежные вопросы