嵌套标题

时间:2016-02-12 13:25:23

标签: xml xslt

有没有办法用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>

非常感谢

1 个答案:

答案 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元素。