使用 map2epubHtmlTocImpl.xsl 重新排序 nav.xhtml (epub) 中的 TOC 输出

Posted

技术标签:

【中文标题】使用 map2epubHtmlTocImpl.xsl 重新排序 nav.xhtml (epub) 中的 TOC 输出【英文标题】:Reorder TOC output in nav.xhtml (epub) using map2epubHtmlTocImpl.xsl 【发布时间】:2021-06-08 20:49:57 【问题描述】:

我正在尝试根据以下条件重新排序 nav.xhtml (epub) 中主题的输出: 如果在 ditamap 中主题 A(可能超过 1 个主题 A)在主题 B 之前,则将主题 A 的 <li> 放在主题 B 的 <li> 之后,这样导航现在看起来像这样

<li>topic xx</li>
<li>topic xx</li>
<li>topic xx</li>...
<li>topic B</li>
<li>topic A</li>
<li>topic A</li>

我设法抑制了&lt;li&gt;topic A&lt;/li&gt; 的第一个输出(即自然顺序)。然后,我输出&lt;li&gt;topic B&lt;/li&gt;。 我在&lt;li&gt;topic B&lt;/li&gt; 之后创建了&lt;li&gt;topic A&lt;/li&gt;(使用xsl:for-each topicA)。我正在手动构建,但它不是很有效。我已经使用preceding-sibling::*[@outputclass='topic A']/@id 重新插入主题 A 的 id(或 $linkId)值,但它不起作用。 我确实设法通过使用以下方法为前面的主题 A 插入了主题标题:

<xsl:apply-templates select="preceding-sibling::*[@outputclass='topic A']" mode="nav-point-title"/>

但这只会输出第二个li中的第一个标题,所以它看起来像这样:

    <li class="tocrm" id=""><a href="XX"></a></li>
    <li class="tocrm" id=""><a href="XX">Topic A1</a></li>

[请注意,我尚未添加包含 href 的代码。这是列表中的下一个!]

如果我可以重用 $linkId 等变量,那就太好了,但它们似乎不想在主题 B 的上下文中工作。 我知道我可能不会得到这个问题的答案,因为它太复杂了,但我已经尝试了数百次迭代,我很茫然。 任何建议将不胜感激。 真挚地, 苦苦挣扎的 d4p 用户

【问题讨论】:

topic B 是作为示例主题(例如 topic A),还是您正在寻找名为 topic B 的特定主题并希望在该特定主题之后对任何前面的主题进行排序? 仅作为示例。我们公司使用一组自定义主题进行发布。例如,topic A outputclass 是announcement_page。 但是整个重新排序的过程,为什么不把topic XX也放在topic B之后呢?我不太确定重新排序的一般标准是什么。 其余主题将按其常规文档顺序输出,因此无需重新组织其他主题。条件是:如果主题 A 在主题 B 之前,则在 nav,xhtml 中,主题 A 必须在主题 B 之后。 嗨,马丁:您的具体代码不起作用,但它让我对如何继续前进有了一些了解。我将尝试更多的东西,看看我是否可以重建 NAV.xhtml 文件。感谢您的提示。 【参考方案1】:

也许您可以更改处理顺序,例如https://github.com/dita4publishers/org.dita4publishers.epub/blob/develop/xsl/map2epubHtmlTocImpl.xsl#L40 使用

<xsl:variable name="b-topics" select="*[df:class(., 'map/topicref')][@title = 'topic B']"/>
<xsl:variable name="a-topics" select="$b-topics/preceding-sibling::*[df:class(., 'map/topicref')][@title = 'topic A']"/>
<xsl:variable name="others" select="$b-topics/preceding-sibling::*[df:class(., 'map/topicref')][@title != 'topic A']"/>
<xsl:apply-templates select="$others, $b-topics, $a-topics, $b-topics/following-sibling::*[df:class(., 'map/topicref')]" mode="#current">

而不是

<xsl:apply-templates select="*[df:class(., 'map/topicref')]" mode="#current">

【讨论】:

看起来很有希望。我会试一试,让你知道结果!非常感谢。

以上是关于使用 map2epubHtmlTocImpl.xsl 重新排序 nav.xhtml (epub) 中的 TOC 输出的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)