出于学习目的,我正在为一本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>
答案 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'/>