首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT:逐页循环遍历一系列元素

XSLT:逐页循环遍历一系列元素
EN

Stack Overflow用户
提问于 2012-10-19 19:10:15
回答 2查看 533关注 0票数 0

我想转换这个XML来创建多页标记作为我的XSLT输出,假设每页有3个标记,那么我的结果如下所示:

我可以做我需要做的任何事情,除了将它们分组到页面中。

代码语言:javascript
复制
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,但顺序似乎很重要,因为我试图分解XML10单独的文件,而以这种方式使用exsl:document会导致每次都覆盖文件,只保留最后一个元素:

代码语言:javascript
复制
<exsl:document href="chunk-{position() mod 10}.xml">

似乎我需要按顺序循环它们(1-3,然后4-6,然后7-8)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-19 20:11:36

试试这个:

代码语言:javascript
复制
<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>

这是一个简单的例子,但它应该足以演示原理。

票数 1
EN

Stack Overflow用户

发布于 2012-10-19 20:08:14

您可以将示例输入转换为所需的输出,如下所示:

代码语言:javascript
复制
<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,但我不确定您想要用它做什么,因为您想要的结果似乎是单个文档。因此,如果这是需求的一部分,请显示您要创建的不同文档的示例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12972976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档