如何在XSLT中生成html TOC标识符?

时间:2012-09-17 16:39:58

标签: html xml xslt tableofcontents

我想在使用XSL生成的HTML文档中生成内容标识符表。

从以下格式:

<?xml version="1.0" encoding="utf-8"?>
<section>
  <header>Heading 1</header>
  <section>
    <section>
      <section>
        <header>Heading 4</header>
      </section>
    </section>
  </section>
  <section>
    <header>Heading 2</header>
    <section>
      <section>
        <section>
          <header>Heading 5</header>
        </section>
      </section>
    </section>
    <section>
      <header>Heading 3</header>
    </section>
  </section>
  <section>
    <header>Heading 2</header>
  </section>
</section>

我已经能够生成:

<?xml version="1.0" encoding="utf-8"?>
<h1>Heading 1</h1>
<h4>Heading 4</h4>
<h2>Heading 2</h2>
<h5>Heading 5</h5>
<h6>Heading 6</h6>
<h2>Heading 2</h2>

感谢:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="UTF-8" />

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="header">
<xsl:variable name="level" select="count(ancestor-or-self::section)"/>
<xsl:element name="h{$level}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

但我需要添加一个额外的TOC标识符:

<?xml version="1.0" encoding="utf-8"?>
<a name="toc1"></a><h1>Heading 1</h1>
<a name="toc1_0_0_1"></a><h4>Heading 4</h4>
<a name="toc1_1"><h2>Heading 2</h2>
<a name="toc1_1_0_0_1"><h5>Heading 5</h5>
<a name="toc1_1_0_0_1_1"><h6>Heading 6</h6>
<a name="toc1_2"><h2>Heading 2</h2>

纯XSLT处理可以实现吗?

1 个答案:

答案 0 :(得分:0)

虽然这与您当前的预期输出不完全匹配,但您可以在此处使用 xsl:number 元素:

<xsl:number count="section" level="multiple" />

您需要将其与翻译功能结合使用才能进行替换。与_虽然。尝试以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes" encoding="UTF-8"/>
   <xsl:template match="/">
      <xsl:apply-templates/>
   </xsl:template>

   <xsl:template match="header">
      <xsl:variable name="level" select="count(ancestor-or-self::section)"/>
      <xsl:variable name="name">
         <xsl:number count="section" level="multiple"/>
      </xsl:variable>

      <a name="{translate($name, '.', '_')}"/>
      <xsl:element name="h{$level}">
         <xsl:apply-templates/>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

这将输出以下内容:

<a name="1" /><h1>Heading 1</h1>
<a name="1_1_1_1" /><h4>Heading 4</h4>
<a name="1_2" /><h2>Heading 2</h2>
<a name="1_2_1_1_1" /><h5>Heading 5</h5>
<a name="1_2_2" /><h3>Heading 3</h3>
<a name="1_3" /><h2>Heading 2</h2>