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.
我认为你有两个问题。
- 如果
name()
没有 title
,您只想使用它
- 您要排序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>
我有一个文档包含的段落混合了用户编写的标题和自动生成的标题,我需要按字母顺序对 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.
我认为你有两个问题。
- 如果
name()
没有title
,您只想使用它
- 您要排序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>