2016-04-05 12 views
0

次の兄弟がテーブルノートでエントリを持つ行に属性type = "bottom line"属性を追加したいと思います。しかし、問題は、結合された列がある場合は追加する必要がありますtype = "bottom line"を入力してください。この数は、エントリ数が等しい場合には停止する必要があります。XSLT 2での再帰

  • をするテーブルノート

    に一番下の行を追加します。OUTPUT

    <table> 
        <row> 
         <entry id="1"></entry> 
         <entry id="2"></entry> 
         <entry id="3" merged="1"></entry> 
         <entry id="4"></entry> 
         <entry id="5"></entry> 
        </row> 
        <row> 
         <entry id="1"></entry> 
         <entry id="2"></entry> 
         <entry id="3" merged="1" type="bottom line"></entry> 
         <entry id="4"></entry> 
         <entry id="5"></entry> 
        </row> 
        <row> 
         <entry id="6" merged="1" type="bottom line"></entry> 
         <entry id="7"></entry> 
         <entry id="8"></entry> 
         <entry id="9"></entry> 
        </row> 
    
        <row> 
         <entry id="10"></entry> 
         <entry id="11"></entry> 
         <entry id="12"></entry> 
         <entry id="13"></entry> 
    
         <entry id="14"></entry> 
    
        </row> 
        <row> 
         <entry id="15" type="bottom line"></entry> 
         <entry id="16" type="bottom line"></entry> 
         <entry id="17" type="bottom line"></entry> 
        </row> 
        <row> 
         <entry type="table notes">test</entry> 
         <entry type="table notes">test</entry> 
         <entry type="table notes">test</entry> 
        </row> 
    </table> 
    

    私がこれまで書いたXSLT期待

    入力XML

    <table> 
        <row> 
         <entry id="1"></entry> 
         <entry id="2"></entry> 
         <entry id="3" merged="1"></entry> 
         <entry id="4"></entry> 
         <entry id="5"></entry> 
        </row> 
        <row> 
         <entry id="1"></entry> 
         <entry id="2"></entry> 
         <entry id="3" merged="1"></entry> 
         <entry id="4"></entry> 
         <entry id="5"></entry> 
        </row> 
        <row> 
         <entry id="6" merged="1"></entry> 
         <entry id="7"></entry> 
         <entry id="8"></entry> 
         <entry id="9"></entry> 
        </row> 
    
        <row> 
         <entry id="10"></entry> 
         <entry id="11"></entry> 
         <entry id="12"></entry> 
         <entry id="13"></entry> 
    
         <entry id=“14"></entry> 
    
        </row> 
        <row> 
         <entry id="15"></entry> 
         <entry id="16"></entry> 
         <entry id="17"></entry> 
        </row> 
        <row> 
         <entry type="table notes">test</entry> 
         <entry type="table notes">test</entry> 
         <entry type="table notes">test</entry> 
        </row> 
    </table> 
    

    マージされたエントリー

    <xsl:template match="row/entry[@merged]" mode="merged"> 
        <xsl:copy> 
         <xsl:apply-templates select="@*"/> 
         <xsl:attribute name="type">bottom line</xsl:attribute> 
         <xsl:apply-templates/> 
        </xsl:copy> 
        <xsl:apply-templates/> 
    </xsl:template> 
    
    <xsl:template match="row[last()-1]"> 
        <xsl:if test="count(./entry) &gt; count(./preceding-sibling::row/entry)"> 
         <xsl:apply-templates mode="merged"/> 
        </xsl:if> 
    </xsl:template> 
    

    用 ボトムライン

この問題を解決するために私を助けてください。 おかげで..

答えて

1

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output method="xml" indent="yes"/> 
    <!-- identity transform template --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- change the desired elements --> 
    <xsl:template match="row[following-sibling::*[1]/entry/@type = 'table notes']/entry | entry[@merged]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:attribute name="type">bottom line</xsl:attribute> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

最初のテンプレートは、アイデンティティがすべての属性ノードをコピーするテンプレートを変換です。 2番目のテンプレートは、@typeを目的の要素に追加します。

+0

ここでは、すべてのエントリ[@merged]に下線を追加しましたが、これを制限したいと思います。現在の行エントリ数が前の行エントリ数と等しい場合は、この属性を追加しないでください。@Lingamurthy 。 – user2490093

+0

@ user2490093私はそれを理解しませんでした。もっと説明してください。あなたの期待された出力はあなたがコメントしたものですか? –