有没有办法用xlst嵌套标题,就像我在这个例子中手动完成的那样? 我需要将标题h1嵌套到h3并将它们中的每一个更改为标记主题/标题。
旧源代码
<title>Text Title</title>
<h1>Text H1</h1>
<p>Text</p>
<h2>Text H2</h2>
<p>Text</p>
<h3>Text H3</h3>
<p>Text</p>
<h3>Text H3</h3>
<p>Text</p>
<h3>Text H3</h3>
<p>Text</p>
<h2>Text H2</h2>
<p>Text</p>
嵌套新代码
<topic>
<title>Text Title</title>
<topic>
<title>Text H1</title>
<p>Text</p>
<topic>
<title>Text H2</title>
<p>Text</p>
<topic>
<title>Text H3</title>
<p>Text</p>
</topic>
<topic>
<title>Text H3</title>
<p>Text</p>
</topic>
<topic>
<title>Text H3</title>
<p>Text</p>
</topic>
</topic>
<topic>
<title>Text H2</title>
<p>Text</p>
</topic>
</topic>
</topic>
非常感谢
答案 0 :(得分:0)
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="group"
match="*[starts-with(local-name(), 'h')]"
use="generate-id(preceding-sibling::*[local-name() = concat('h', number(substring-after(local-name(current()), 'h')) - 1)])" />
<xsl:template match="body">
<topic>
<xsl:apply-templates select="title|h1" />
</topic>
</xsl:template>
<xsl:template match="*[starts-with(local-name(), 'h')]">
<topic>
<title><xsl:value-of select="." /></title>
<xsl:apply-templates select="following-sibling::p[1]" />
<xsl:apply-templates select="key('group', generate-id())" />
</topic>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这定义了一个名为group
的密钥,用于将以h
开头的元素按其下一个数字向下的h
元素进行分组。因此,当您定位在h
元素上时,您可以使用该键来获取嵌套元素。
请注意,这也假设每个h
元素后面跟着一个,p
元素。