2017-09-12 7 views
0

の最後の発生は私のxmlファイルを考慮しなさい:カウンタ

<Record> 
    <AA bac="1" kjd="Same"/> 
    <BB dfd="02" dad="342"/> 
    <CC pod="11-A" dsd="11-B"/> 
    <CC pod="22-A" dsd="22-B"/> 
    <CC pod="33-A" dsd="33-B"/> 
    <CC pod="44-A" dsd="44-B"/> 
    <CC pod="55-A" dsd="55-B"/> 
    <CC pod="66-A" dsd="66-B"/> 
    <CC pod="77-A" dsd="77-B"/> 
</Record> 

私はCCのすべての3つの出現するためのカウンタである要素CC、下の別の属性(CNT)を追加する必要があります。それが4に達したら、私はそれを増やす必要があります。私はすでにその部分を行っていましたが、CCの@cntの最後の値を取得し、AAの属性の新しい(@ cnt_1)に配置する必要があります。

は、ここに私のXSLTです:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes" method="xml"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="Record"> 
    <xsl:copy> 
     <xsl:apply-templates select="* except CC"/> 
     <xsl:for-each-group select="CC" group-adjacent="(position() - 1) idiv 3"> 
      <xsl:apply-templates select="current-group()"> 
       <xsl:with-param name="group-pos" select="position()"/> 
      </xsl:apply-templates> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="CC"> 
    <xsl:param name="group-pos"/> 
    <CC cnt="{$group-pos}" seq="{position()}"> 
     <xsl:apply-templates select="@*"/> 
    </CC> 
</xsl:template> 
<xsl:template match="CC/@*[not(normalize-space())]"/> 
<xsl:template match="BB/@*[not(normalize-space())]" /> 
<xsl:template match="AA/@*[not(normalize-space())]" /> 

予想される出力:

<Record> 
    <AA cnt_1="3" bac="1" kjd="Same"/> 
    <BB dfd="02" dad="342"/> 
    <CC cnt="1" seq="1" pod="11-A" dsd="11-B"/> 
    <CC cnt="1" seq="2" pod="22-A" dsd="22-B"/> 
    <CC cnt="1" seq="3" pod="33-A" dsd="33-B"/> 
    <CC cnt="2" seq="1" pod="44-A" dsd="44-B"/> 
    <CC cnt="2" seq="2" pod="55-A" dsd="55-B"/> 
    <CC cnt="2" seq="3" pod="66-A" dsd="66-B"/> 
    <CC cnt="3" seq="1" pod="77-A" dsd="77-B"/> 
</Record> 

ありがとう!およそ

答えて

1

方法:

<xsl:template match="AA"> 
    <xsl:copy> 
     <xsl:attribute name="cnt_1" select="ceiling(count(../CC) div 3)"/> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
+0

はありがとうございました! –