element()* にドキュメントオーダーを強制する
以下は入力の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から作るにはどのようにしたらよいでしょうか?