XSLT 分组 [英] XSLT Grouping

查看:23
本文介绍了XSLT 分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有两级(标题和行)标签的简单 XML,例如:

I have a simple XML with two levels (Header and Line) of tags such as:

<?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>

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

I need to group the lines on sets of X (X=3 for example) lines so that my output is the following:

<?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> 

如何编写可以进行这种转换的 XSLT?

How do I write a XSLT that can do this kind of transformation?

谢谢!

推荐答案

以下转换产生所需的结果:

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

应用于提供的 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>

结果是:

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

请注意以下事项:

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

  1. The use of the XPath mod operator to find out the first line element in every group of vN elements.

modes的使用,为了能够通过不同的模板处理不同的line元素

The use of modes, in order to be able to process different line elements by different templates

这篇关于XSLT 分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆