XSLT:分组问题

时间:2017-04-27 09:48:10

标签: xml xslt

我有一个来自客户端的平面XML文件。我需要对节点模式匹配上的数据进行分组。

例如,我需要将此转换为 -     

<root>
<p>
    <row>
        <head>Heading 1</head>
    </row>
</p> 
<p>Some Text</p> 
<p>Some Text</p> 
<p>
    <row>
        <head>Heading 2</head>
    </row> 
</p> 
<p>Some Text</p> 
<p>Some Text</p> 
<p>
    <row>
        <head>Heading 3</head>
    </row> </p> 
<p>Some Text</p> 
<p>Some Text</p> 
</root>

我的要求是: 按模式<P><row><head>分组(没有文本),并为每个匹配组添加单独的部分。

Expected output would be :
<root>
<Mygroup>
    <p>
        <row>
            <head>Heading 1</head>
        </row>
    </p> 
    <p>Some Text</p> 
    <p>Some Text</p> 
</Mygroup>
<Mygroup>
    <p>
        <row>
            <head>Heading 2</head>
        </row> 
    </p> 
    <p>Some Text</p> 
    <p>Some Text</p> 
</Mygroup>
<Mygroup>
    <p>
        <row>
            <head>Heading 3</head>
        </row> </p> 
    <p>Some Text</p> 
    <p>Some Text</p> 
</Mygroup>
</root>

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这里有一个有效的例子。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

  <xsl:template match="root">
    <xsl:copy>
      <xsl:for-each-group select="p" group-starting-with=".[row/head]">
        <Mygroup>
          <xsl:sequence select="current-group()"/>
        </Mygroup>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
</xsl:transform>

for-each-group选择所有p个元素(root的全部内容), 将它们分成小组。

每个小组都来自p元素(适用于group-starting-with 是当前元素.)),符合谓词: 必须有一个row的孩子,里面有head

现在转到输出:每个组的内容都附有 Mygroup开始和结束标记。 在他们之间有整个当前小组的内容。

请注意,我使用sequence而不是copy-of。 我出于效率原因这样做(在网上搜索之间的差异) 它们)。