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

Reorder TOC output in nav.xhtml (epub) using map2epubHtmlTocImpl.xsl

我正在尝试根据以下条件对 nav.xhtml (epub) 中的主题输出进行重新排序: 如果主题 A(可能超过 1 个主题 A)在 ditamap 中位于主题 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-每个主题 A)。我正在进行手动构建,但效果不佳。我已经使用 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 用户

也许您可以更改处理顺序,例如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">