使用 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>
我设法抑制了<li>topic A</li>
的第一个输出(即自然顺序)。然后,我输出<li>topic B</li>
。
我在<li>topic B</li>
之后创建了<li>topic A</li>
(使用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有三种方式(不使用,动态使用,静态使用,默认是动态使用)