使用 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">
我正在尝试根据以下条件对 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">