2017-04-27 128 views
0

我有一个是从客户端来了一个平坦的XML文件。我需要对节点模式匹配中的数据进行分组。XSLT:分组问题

例如,我需要转换这 -

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

感谢您的帮助。

+0

查看任何'xsl:for-each-group group-starting-with'示例(https://www.w3.org/TR/xslt20/#grouping-examples)如果您可以使用XSLT 2.0 –

+2

您真的需要标记XSLT问题作为XSLT 1.0或2.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 是当前元素.)),满足谓词开始: 必须有一个孩子rowhead内部。

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

请注意,我用sequencecopy-of。 我这样做是出于效率的考虑(在网络上搜索 它们之间的差异)。

+0

感谢您的帮助Valdi_Bo。它的工作..我真的很感激它如何工作的解释。 – user23