2012-10-19 66 views
0

我想要改造這個XML創建的標籤,展示我的XSLT輸出網頁,讓我們說3每頁所以我最終是這樣的:XSLT:循環在一定範圍內的元素,頁面由

我可以做我需要的一切,除了將它們分組成頁面。

INPUT XML: 
<root> 
    <element>a</element> 
    <element>b</element> 
    <element>c</element> 
    <element>e</element> 
    <element>f</element> 
    <element>g</element> 
    <element>h</element> 
    <element>i</element> 
</root> 

XSLT RESULT XML: 
<root> 
    <page num="1"> 
     <element>a</element> 
     <element>b</element> 
     <element>c</element> 
    </page> 
    <page num="2"> 
     <element>d</element> 
     <element>e</element> 
     <element>f</element> 
    </page> 
    <page num="3"> 
     <element>g</element> 
     <element>h</element> 
    </page> 
</root> 

我試過position() mod X,但因爲我試圖打破XML 10單獨的文件,並使用exsl:document這樣會導致它每次覆蓋文件,只保留最後一個元素的順序似乎很重要:

<exsl:document href="chunk-{position() mod 10}.xml"> 

看來我需要依次循環它們(1-3,然後4-6,然後7-8)。

注:我在linux上使用xsltproc,所以它支持EXSL但不支持XSLT2.0。

回答

1

試試這個:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="root"> 
    <xsl:copy> 
     <xsl:apply-templates select="element[position() mod 3 = 1]" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="element"> 
    <page num="{position()}"> 
     <xsl:copy-of select=". | following-sibling::element[position() &lt; 3]" /> 
    </page> 
    </xsl:template> 
</xsl:stylesheet> 

這是一個簡單的例子,但它應該是足以證明原則。

+0

XSLT感覺像大腦健身房。我明白了,非常感謝一個簡單易用的示例,它只是起作用! –

2

您可以將樣品輸入到所需的輸出如下:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:param name="block-size" select="3"/> 

<xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 


<xsl:template match="root"> 
    <xsl:copy> 
    <xsl:apply-templates select="element[(position() - 1) mod $block-size = 0]" mode="page"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="element" mode="page"> 
    <page num="{position()}"> 
    <xsl:apply-templates select=". | following-sibling::element[position() &lt; $block-size]"/> 
    </page> 
</xsl:template> 

</xsl:stylesheet> 

所以這樣式表需要一個輸入文件,並創建一個輸出文檔,和你們的樣品表示。

你也提到exsl:document但我不確定你想要做什麼,因爲你想要的結果似乎是一個單一的文件。因此,如果這是需求的一部分,請顯示您想創建的不同文檔的樣本。

+0

謝謝你的回答,這對於幫助我理解這一切如何工作非常有用,現在我明白了。我真的很感激你花在這上面的時間。我希望我能標出兩個正確答案! –

+0

我只是提到了exsl:document,因爲我不想得到我在很多地方看到的「按列排序」解決方案,這是一個比你們提供的更簡化的位置mod X版本。爲了簡單起見,我把它放在了外面,但它現在完美地運行在我的代碼中。 –