以下は入力のXML文書から目次を作るために対象要素を変数(element()*)に格納したコードです.目次の対象は

  • 用語集
  • 索引
  • 章とその下の2階層のtopicref(DITAの場合)、section(DocBookの場合)

を示しています.

[DITAのコード]

<xsl:variable name="tocCandidatesElem" as="element()*">
    <xsl:sequence select="$map/descendant::*[contains(@class,' bookmap/indexlist ')]"/>
    <xsl:sequence select="$map/descendant::*[contains(@class,' bookmap/glossarylist ')]"/>
    <xsl:for-each select="$map/descendant::*[contains(@class,' bookmap/chapter ') or contains(@class,' bookmap/appendix ')]">
        <xsl:variable name="topicRef" as="element()" select="."/>
        <xsl:sequence select="$topicRef/descendant-or-self::*[position() le 3]"/>
    </xsl:for-each>
</xsl:variable>

※ $mapはbookmapを指すものとお考えください.

[DocBookの場合]

<xsl:variable name="tocCandidatesElem" as="element()*">
    <xsl:sequence select="/set/book[1]/glossary"/>
    <xsl:sequence select="/set/book[1]/index"/>
    <xsl:for-each select="/set/book[1]/chapter | /set/book[1]/appendix">
        <xsl:variable name="chapter" as="element()" select="."/>
        <xsl:sequence select="$chapter/>
        <xsl:sequence select="$chapter/descendant::section[position() le 2]"/>
    </xsl:for-each>
</xsl:variable>

※ DocBookは最近やっていないので怪しいかもしれません.

さて$tocCandidatesElemから実際に目次を作成したいのですが、このままでは索引、用語集、章、...の順となってしまい、文書の中に中に定義された順(ドキュメントオーダー)になっていません.

$tocCandidatesElemの中の定義順がどうあれ、ドキュメントオーダーになるような新しい変数を$tocCandidatesElemから作るにはどのようにしたらよいでしょうか?