XSLT:如何对位于同一级别的各个元素进行分类

时间:2011-04-27 16:02:05

标签: xslt nested-loops

亲爱的社区, 我想转换一个具有以下格式的初始xml:

<h2>title1</h2>
<div>sometext1</div>
<div>sometext2</div>
<h2>title2</h2>
<div>sometext3</div>
<div>sometext4</div>
<h2>title3</h2>
<div>sometext5</div>
<div>sometext6</div>

进入

<cat name="title1">
<div>sometext1</div>
<div>sometext2</div>
</cat>
<cat name="title2">
<div>sometext3</div>
<div>sometext4</div>
</cat>
<cat name="title3">
<div>sometext5</div>
<div>sometext6</div>
</cat>

我尝试执行double for-each并创建一个变量来保存“select”选项以执行内部for-each,但似乎需要使用node-set()函数。即使我尝试包含它,它也不起作用。您是否有任何关于如何使用XSLT 1.0解决此问题的想法,并且最好不使用任何其他命名空间?

1 个答案:

答案 0 :(得分:0)

这是一种不依赖于嵌套循环的方法。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:key name="x" match="div" use="preceding-sibling::h2[1]"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()[not(name()='div')]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="h2">
    <cat name="{text()}">
      <xsl:apply-templates select="key('x',.)"/>
    </cat>
  </xsl:template>

</xsl:stylesheet>

它首先构建一个索引(xsl:key),将每个div映射到它前面的h2。然后我们有一个简单的身份转换,跳过div条目。对于遇到的每个h2,我们生成<cat>,然后输出从该h2索引的<div...>标记。