我有一个来自客户端的平面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>
感谢您的帮助。
答案 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
。
我出于效率原因这样做(在网上搜索之间的差异)
它们)。