亲爱的社区, 我想转换一个具有以下格式的初始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解决此问题的想法,并且最好不使用任何其他命名空间?
答案 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...>
标记。