0

ここでこれについていくつか質問があることを知っています。私は多くの解決策を試しましたが、まだ行き詰まっています。このページネーションを xslで使用しようとしましたが、これ はXSLT を使用して XML を複数のページに分割できますか? しかし、私が必要とするものを手に入れません、

XSLT パーサーを介して XML を使用して、生成された html にページネーションを作成する必要があります。

XMLファイルはこんな感じ

<root>
    <result>
        <a>field one</a>
        <b>field two</b>
        <c>field three</c>
    </result>
    <result>
        <a>hello</a>
        <b>thanks</b>
        <c>for help</c>
    </result>
    <result>
        <a>thank</a>
        <b>you</b>
        <c>!!</c>
    </result>
    ..... 
</root>

ページネーションなしの私のXSLTはこれです

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:user="http://mycompany.com/mynamespace">


    <xsl:output method="html" indent="yes" />

    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>

    <xsl:template match="root">
                    <xsl:for-each select="result">
                        <div class="list_item">
                            <div class="dmv_line">
                                <div class="box_text">
                                    <h2><xsl:value-of select="a"/></h2>
                                </div>
                                </div>
                                <div class="dmv_line">
                                    <div class="box_text">
                                        <h2><xsl:value-of select="b"/></h2>
                                    </div>
                                </div>
                                <div class="dmv_line">
                                    <div class="box_text">
                                        <h2><xsl:value-of select="c"/></h2>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </xsl:for-each>
    </xsl:template>


</xsl:stylesheet>

私が必要とするのは、<div>結果を 3 x 3 または 4 x 4 でカプセル化する を作成することです。これは、後で JavaScript で非表示または表示にします..ありがとう

[編集]: HTML 出力、1 ページあたり 2 要素のページネーションを作成すると仮定した場合、例の 3 つの要素のみを考慮すると、出力は次のようになります。

<-- page number one --->
<div id="1">
 <div class="list_item">
     <div class="dmv_line">
        <div class="box_text">
            <h2>field one</h2>
        </div>
     </div>
    <div class="dmv_line">
        <div class="box_text">
            <h2>field two</h2>
        </div>
     </div>
     <div class="dmv_line">
        <div class="box_text">
            <h2>field three</h2>
        </div>
     </div>
    </div>
     <div class="list_item">
         <div class="dmv_line">
            <div class="box_text">
                <h2>hello</h2>
            </div>
         </div>
        <div class="dmv_line">
            <div class="box_text">
                <h2>thanks</h2>
            </div>
         </div>
         <div class="dmv_line">
            <div class="box_text">
                <h2>for help</h2>
            </div>
         </div>
    </div>
</div>
 <-- END OF page number one --->
 <-- page number two --->
<div id="2">     
     <div class="list_item">
         <div class="dmv_line">
            <div class="box_text">
                <h2>thank</h2>
            </div>
         </div>
        <div class="dmv_line">
            <div class="box_text">
                <h2>you</h2>
            </div>
         </div>
         <div class="dmv_line">
            <div class="box_text">
                <h2>!!!</h2>
            </div>
         </div>
    </div>
</div>  
 <-- END OF page number two --->
4

1 に答える 1

1

このような問題に対するアプローチは、最初に各「ページ」で最初に出現する要素を選択することです。これは、その位置を確認することによって実現されます。

<xsl:for-each select="result[position() mod $size = 1]">

したがって、$size変数が 2 に設定されている場合、1、3、5 などの位置にある結果要素が選択されます...

このループ内で、「age」を含むdivタグを出力できます。

<div id="{position()}">  

position は状況依存であり、選択したノード セット内のノードの位置を返すことに注意してください (つまり、1、2、3 などを返します)。

最後に、 「ページ」を構成する結果要素を取得するには、次のように選択できます

<xsl:apply-templates select="self::*|following-sibling::*[position() &lt; $size]" />

そして、それらに一致するテンプレートは、事実上xsl:for-each内の既存のコードのようになります。

次の XSLT を試してください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:param name="size" select="2"/>

   <xsl:output method="html" indent="yes"/>

   <xsl:template match="/">
      <html>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="root">
      <xsl:for-each select="result[position() mod $size = 1]">
         <div id="{position()}">
            <xsl:apply-templates select="self::*|following-sibling::*[position() &lt; $size]"/>
         </div>
      </xsl:for-each>
   </xsl:template>

   <xsl:template match="result">
      <div class="list_item">
         <div class="dmv_line">
            <div class="box_text">
               <h2>
                  <xsl:value-of select="a"/>
               </h2>
            </div>
         </div>
         <div class="dmv_line">
            <div class="box_text">
               <h2>
                  <xsl:value-of select="b"/>
               </h2>
            </div>
         </div>
         <div class="dmv_line">
            <div class="box_text">
               <h2>
                  <xsl:value-of select="c"/>
               </h2>
            </div>
         </div>
      </div>
   </xsl:template>
</xsl:stylesheet>

これにより、必要な出力が得られるはずです。

余談ですが、コード内にコードの繰り返しが少しあります。代わりに、結果に一致するテンプレートを次の 2 つのテンプレートに置き換えてみてください。

<xsl:template match="result">
   <div class="list_item"> 
      <xsl:apply-templates select="a|b|c" />
   </div>
</xsl:template>

<xsl:template match="result/*">
      <div class="dmv_line">
         <div class="box_text">
            <h2>
               <xsl:value-of select="."/>
            </h2>
         </div>
       </div>
</xsl:template>
于 2013-10-17T07:05:01.500 に答える