0

我想转换这个 XML 以创建标签页作为我的 XSLT 输出,假设每页 3 个,所以我最终得到如下内容:

除了将它们分组到页面之外,我可以做我需要的一切。

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。

4

2 回答 2

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了,但我不确定你想做什么,因为你想要的结果似乎是一个文档。因此,如果这是要求的一部分,请展示您要创建的不同文档的示例。

于 2012-10-19T12:08:13.617 回答
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>

这是一个简单的例子,但应该足以说明原理。

于 2012-10-19T12:11:36.237 回答