XSL 对自动生成和用户输入的标题进行排序

XSL Sort on Autogenerated and User entered Titles

我有一个文档包含的段落混合了用户编写的标题和自动生成的标题,我需要按字母顺序对 table 内容进行排序。

数据看起来像

<theory><text>Stuff goes here</text></theory>
<general><text>More stuff</text></general>
<paragraph><title>First user title</title><text>Lots of stuff</text>   
   <subparagraph><title>Subordinate Paragraph</title><text>The last stuff.</text></subparagraph>
</paragraph>
<paragraph><title>Last user title</title><text>Just a little stuff</text>
</paragraph>

预期输出是

3. First User Title............
2. General Information.........
4. Last User Title.............
3.1 Subordinate Paragraph......
1. Theory of Operation.........

我不知道如何让它对某些段落的字面值和存在的标题进行排序。现在我有:

<xsl:for-each select="paragraph|theory|general|paragraph/subparagraph">
   <xsl:sort select="name()"/>
   <xsl:sort select="title"/>
   <xsl:apply-templates select="." mode="TOC"/>
</xsl:for-each>

但输出为:

2. General................
3. First User Title.......
4. Last User Title........
1. Theory of Operation....
3.1 Subordinate Paragraph.

我认为你有两个问题。

  1. 如果 name() 没有 title
  2. ,您只想使用它
  3. 您要排序case-insensitive

您可以将您的排序方式更改为如下形式(XSLT 2.0 或更高版本):

<xsl:sort select="lower-case((title,name())[1])"/>

您可以使用模板规则计算排序键,以更通用的方式处理此问题:

<xsl:for-each select="paragraph,theory,general">
   <xsl:sort>
      <xsl:apply-templates select="." mode="sort-key"/>
   </xsl:sort>
   <xsl:apply-templates select="." mode="TOC"/>
</xsl:for-each>

<xsl:template match="paragraph" mode="sort-key" as="xs:string">
  <xsl:sequence select="string(title)"/>
</xsl:template>

<xsl:template match="theory|general" mode="sort-key" as="xs:string">
  <xsl:sequence select="string(text)"/>
</xsl:template>