首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对邻居兄弟姐妹进行分组

如何对邻居兄弟姐妹进行分组
EN

Stack Overflow用户
提问于 2013-05-13 15:41:52
回答 1查看 129关注 0票数 0

我有这样的东西:

代码语言:javascript
复制
<root>
  <a>foo</a>
  <b>bar</b>
  <groupme>foobar</groupme>
  <groupme>baz</groupme>
  <groupme>42</groupme>
  <c>abc</c>
  <d>def</d>
  <groupme>foo</groupme>
  <x>xyz</x>
  <groupme>bar</groupme>
  <groupme>foo</groupme>
  <z>thats it</z>
</root>

现在我需要直接相邻的所有groume都是单个节点,如下所示:

代码语言:javascript
复制
<root>
  <a>foo</a>
  <b>bar</b>
  <groupme>foobar baz 42</groupme>
  <c>abc</c>
  <d>def</d>
  <groupme>foo</groupme>
  <x>xyz</x>
  <groupme>bar foo</groupme>
  <z>thats it</z>
</root>

还有包含其他节点的groupme节点,我只提供一个简单的示例。groupme节点只出现在特定级别,其他级别的groupme节点只出现在root中。

对我有什么帮助吗?

EN

回答 1

Stack Overflow用户

发布于 2013-05-13 17:06:30

这样的分组可以通过一种称为“同级递归”的方法来实现,对于您的问题,我建议使用如下样式表:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root/groupme[not(preceding-sibling::*[1][self::groupme])]">
  <xsl:copy>
    <xsl:apply-templates select="node()"/>
    <xsl:apply-templates select="following-sibling::*[1][self::groupme][1]" mode="list"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root/groupme[preceding-sibling::*[1][self::groupme]]"/>


<xsl:template match="root/groupme[preceding-sibling::*[1][self::groupme]]" mode="list">
  <xsl:text> </xsl:text>
  <xsl:apply-templates select="node()"/>
  <xsl:apply-templates select="following-sibling::*[1][self::groupme][1]" mode="list"/>
</xsl:template>

</xsl:stylesheet>

当应用于输入时

代码语言:javascript
复制
<root>
  <a>foo</a>
  <b>bar</b>
  <groupme>foobar</groupme>
  <groupme>baz</groupme>
  <groupme>42</groupme>
  <c>abc</c>
  <d>def</d>
  <groupme>foo</groupme>
  <x>xyz</x>
  <groupme>bar</groupme>
  <groupme>foo</groupme>
  <z>thats it</z>
</root>

结果是

代码语言:javascript
复制
<root>
  <a>foo</a>
  <b>bar</b>
  <groupme>foobar baz 42</groupme>
  <c>abc</c>
  <d>def</d>
  <groupme>foo</groupme>
  <x>xyz</x>
  <groupme>bar foo</groupme>
  <z>thats it</z>
</root>

作为同级递归的替代方案,还可以使用基于键的方法“获取”以下同级:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:key 
  name="first"
  match="root/groupme[preceding-sibling::*[1][self::groupme]]"
  use="generate-id(preceding-sibling::groupme[not(preceding-sibling::*[1][self::groupme])][1])"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root/groupme[not(preceding-sibling::*[1][self::groupme])]">
  <xsl:copy>
    <xsl:apply-templates select="node()"/>
    <xsl:apply-templates select="key('first', generate-id())" mode="list"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root/groupme[preceding-sibling::*[1][self::groupme]]"/>

<xsl:template match="root/groupme" mode="list">
  <xsl:text> </xsl:text>
  <xsl:apply-templates select="node()"/>
</xsl:template>

</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16517032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档