Xml XSLT-分析给定节点的以下同级
我有一个xml,如下所示Xml XSLT-分析给定节点的以下同级,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有一个xml,如下所示 <doc> <h1>header 1</h1> <p>para</p> <p>para</p> <h1>header 2</h1> <p>para</p> <h2>header 2 sub h1</h2> <h2>header 2 sub
<doc>
<h1>header 1</h1>
<p>para</p>
<p>para</p>
<h1>header 2</h1>
<p>para</p>
<h2>header 2 sub h1</h2>
<h2>header 2 sub h2</h2>
<h1>header 3</h1>
<p>para</p>
<p>para</p>
<h1>header 4</h1>
<h2>header 4 sub h1</h2>
<p>para</p>
</doc>
标题1
帕拉
帕拉
标题2
帕拉
标题2子标题h1
标题2子标题h2
标题3
帕拉
帕拉
标题4
标题4子标题h1
第
我需要的是有序地获取所有
和
节点,并创建一个无序列表
所以最终的输出应该是这样的
<doc>
<ul>
<li><h1>header 1</h1><li>
<li><h1>header 2</h1></li>
<ul>
<li><h2>header 2 sub h1</h2></li>
<li><h2>header 2 sub h2</h2><li>
</ul>
<li><h1>header 3</h1></li>
<li><h1>header 4 sub h1</h1></li>
<ul>
<li><h2>zz</h2></li>
</ul>
</ul>
</doc>
- 标题1
-
- 标题2
- 标题2子标题h1
- 标题2子项h2
-
- 标题3
- 标题4子标题h1
- zz
我编写的xsl如下所示
<xsl:template match="doc">
<doc>
<xsl:for-each select="//h1">
<li>
<xsl:apply-templates/>
</li>
<ul>
<xsl:for-each-group select="//h2" group-by="count(preceding::h1)">
<li><xsl:apply-templates/></li>
</xsl:for-each-group>
</ul>
</xsl:for-each>
</doc>
</xsl:template>
<doc>
<li>header 1</li>
<ul><li>header 2 sub h1header 4 sub h1</li></ul>
<li>header 2</li>
<ul></li>header 2 sub h1header 4 sub h1</li></ul>
<li>header 3</li>
<ul></li>header 2 sub h1header 4 sub h1</li></ul>
<li>header 4</li>
<ul></li>header 2 sub h1header 4 sub h1</li></ul>
</doc>
结果如下:
<xsl:template match="doc">
<doc>
<xsl:for-each select="//h1">
<li>
<xsl:apply-templates/>
</li>
<ul>
<xsl:for-each-group select="//h2" group-by="count(preceding::h1)">
<li><xsl:apply-templates/></li>
</xsl:for-each-group>
</ul>
</xsl:for-each>
</doc>
</xsl:template>
<doc>
<li>header 1</li>
<ul><li>header 2 sub h1header 4 sub h1</li></ul>
<li>header 2</li>
<ul></li>header 2 sub h1header 4 sub h1</li></ul>
<li>header 3</li>
<ul></li>header 2 sub h1header 4 sub h1</li></ul>
<li>header 4</li>
<ul></li>header 2 sub h1header 4 sub h1</li></ul>
</doc>
标题1
- 标题2子标题h1标题4子标题h1
- 标题2
标题2子标题h1标题4子标题h1
- 标题3
标题2子标题h1标题4子标题h1
- 标题4
标题2子标题h1标题4子标题h1
如您所见,我在每次摸索中都会在相关的
节点下添加
节点。(这是我可以想到的在其相关的
节点下添加
节点的解决方案。)但是,正如您所看到的,它没有给出预期的输出
你能建议一种方法我如何改变我的代码以获得预期的结果吗。或者可能是获得预期结果的另一种方法?您希望此组从开始
<xsl:template match="doc">
<ul>
<xsl:for-each-group select="*" group-starting-with="h1">
<li><xsl:copy-of select="."/></li>
<ul>
<xsl:apply-templates select="current-group()[self::h2]"/>
</ul>
</xsl:for-each-group>
</ul>
</xsl:template>
你真的想要这个输出吗?在HTML中,
元素的所有子元素必须是
元素。然而,就XSLT而言,您应该能够适应这种方法。这在+1时非常有效。此代码中的html可能错误。我只是想解释一下这个问题。谢谢你的回答。:)