2013-10-16 26 views
0

我知道這裏有一些問題,我嘗試了很多解決方案,但我仍然陷入困境。 我試圖用這個pagination in xslPossible to split XML into multiple pages with XSLT?但沒有得到我所需要的,使用XSLT分頁將XML轉換爲HTML

我需要在我生成html創建一個分頁,使用XML通過XSLT解析器。

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>,通過4封裝了3或4的結果如圖3所示,其中我會隱藏或在javascript後可見.. 謝謝

[編輯]: HTML輸出,如果我假設使每頁的頁碼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 ---> 
+1

,如果你給您所期待的輸出,當你有分頁的HTML的樣本這將有助於。謝謝!已添加html –

+0

。感謝您的時間 –

回答

1

對於這樣的問題,採取的辦法是,首先選擇將首先發生在每個'的元素頁面。這是通過檢查其位置來實現的。

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

所以,如果$大小變量被設置爲2,這將選擇結果中的位置1,3,5,等元素...

在這個循環中,然後可以輸出含DIV標籤爲「年齡」

<div id="{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> 

這樣應該可以給你所需要的輸出。

另一方面,您的代碼中有一些代碼重複。嘗試更換該結果匹配與這兩個模板代替模板:

<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> 
+0

非常感謝! 工作完美。 也感謝您的旁白解決方案,但我的HTML有更多的類旁邊的「box_text」,我只是舉一個簡短的例子:) +1之前我試過了,接受答案時檢查是好的! 再次感謝 –