Xpath表达式从xml源创建TOC(html)

时间:2014-04-17 07:06:10

标签: xml xslt xpath

出于学习目的,我正在为一本docbook文档开发一个轻量级的XSLT。我的问题是产生TOC 我想我的XPath表达式是错误的,但我无法找出正确的表达式。请查看我的文件的以下片段。我使用Saxon9.5从XML翻译成HTML。

样式表

<!-- Stylesheet -->
<xsl:template match='db:toc'>
    <div id='toc'>
        <h1>Table of contents</h1>
        <ol>
            <!-- This line is not working. -->
            <xsl:apply-templates select='db:chapter' mode='toc'/>
        </ol>
    </div>
</xsl:template>
<xsl:template match='db:chapter' mode='toc'>
    <li>
        <a href='{generate-id()}'>
            <xsl:value-of select='title'/>
        </a>
    </li>
</xsl:template>

Docbook来源

<!-- XML source -->
<book xmlns='http://docbook.org/ns/docbook' xml:lang="en">
    <toc/>
    <chapter>
        <title>Chapter 01</title>
        <para>
            Cupcake ipsum dolor sit amet candy. Muffin lemon drops soufflé croissant pastry jelly beans candy sweet 
            roll. 
        </para>

我的HTML输出

<!-- The HTML output -->
<div id="toc">
    <h1>Table of contents</h1>
    <ol></ol>
</div>

1 个答案:

答案 0 :(得分:1)

你是正确的,这条线不起作用......

<xsl:apply-templates select='db:chapter' mode='toc'/>

原因是您目前位于与 toc 相匹配的模板中。但是章节不是 toc 的子元素,这是apply-templates尝试选择的内容。它实际上是一个兄弟姐妹。试试这个

<xsl:apply-templates select='following-sibling::db:chapter' mode='toc'/>

或者这可能是为了获得 toc 之父的子元素

<xsl:apply-templates select='../db:chapter' mode='toc'/>