XSLT分组

Ota*_*vio 5 xslt

我有一个简单的XML,有两个级别(Header和Line)标签,例如:

<?xml version="1.0"?>
<Header>
    <line>Line 1</line>
    <line>Line 2</line>
    <line>Line 3</line>
    <line>Line 4</line>
    <line>Line 5</line>
    <line>Line 6</line>
    <line>Line 7</line>
    <line>Line 8</line>
    <line>Line 9</line>
</Header>
Run Code Online (Sandbox Code Playgroud)

我需要在X组(例如X = 3)行上对行进行分组,以便我的输出如下:

<?xml version="1.0"?>
<Header>
    <set>
        <line>Line 1</line>
        <line>Line 2</line>
        <line>Line 3</line>
    </set>
    <set>
        <line>Line 4</line>
        <line>Line 5</line>
        <line>Line 6</line>
    </set>
    <set>
        <line>Line 7</line>
        <line>Line 8</line>
        <line>Line 9</line>
    </set>
</Header> 
Run Code Online (Sandbox Code Playgroud)

如何编写可以进行此类转换的XSLT?

谢谢!

Ø

Dim*_*hev 4

以下转换产生所需的结果

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vN" select="3"/>

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates 
           select="line[position() mod $vN = 1]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="line">
    <set>
      <xsl:apply-templates mode="copy" select= 
       ". 
       | 
        following-sibling::line[position() &lt; $vN]"/>
    </set>
  </xsl:template>

    <xsl:template match="line" mode="copy">
      <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

当应用于提供的 XML 文档时

<Header>
    <line>Line 1</line>
    <line>Line 2</line>
    <line>Line 3</line>
    <line>Line 4</line>
    <line>Line 5</line>
    <line>Line 6</line>
    <line>Line 7</line>
    <line>Line 8</line>
    <line>Line 9</line>
</Header>
Run Code Online (Sandbox Code Playgroud)

结果是

<Header>
  <set>
    <line>Line 1</line>
    <line>Line 2</line>
    <line>Line 3</line>
  </set>
  <set>
    <line>Line 4</line>
    <line>Line 5</line>
    <line>Line 6</line>
  </set>
  <set>
    <line>Line 7</line>
    <line>Line 8</line>
    <line>Line 9</line>
  </set>
</Header>
Run Code Online (Sandbox Code Playgroud)

请注意以下事项

  1. 使用 XPathmod运算符找出line每组vN元素中的第一个元素。

  2. 使用模式,以便能够line通过不同的模板处理不同的元素。