我的xml格式如下:
<?xml>
<chapter>
<long-name>Chapter 1</long-name> <!-- 1-->
<chapter>
<long-name>Chapter A</long-name> <!-- 1.1 -->
<chapter>
<long-name>Chapter B</long-name> <!-- 1.1.1 -->
</chapter>
</chapter>
<chapter>
<long-name>Chapter C</long-name> <!-- 1.2-->
</chapter>
</chapter>
<chapter>
<long-name>Chapter 2</long-name> <!-- 2 -->
<chapter>
<long-name>Chapter D</long-name> <!-- 2.1-->
</chapter>
<chapter>
<long-name>Chapter E</long-name> <!-- 2.2-->
</chapter>
</chapter>
</xml>
1. Chapter 1
1.1 chapter A
1.1.1 Chapter B
1.2 Chapter C
2.Chapter 2
2.1 Chapter D
2.2 Chapter E
我想创建一个动态目录,并且章节应该对齐。下面是我用于创建TOC的xslt,这是有效的。但我不知道如何根据他们的水平缩进这些章节。
XSLT:
<xsl:template name="generateTOC">
<fo:block break-after="page">
<xsl:apply-templates select="chapter"
mode="TOC" />
</fo:block>
</fo:block>
</xsl:template>
<xsl:template match="chapter" mode="TOC">
<fo:block text-align-last="justify" font-style="italic"
font-size="8pt" >
<fo:basic-link internal-destination="{generate-id(.)}" color="blue">
<xsl:number format="1.1 " level="multiple"
/>
<xsl:value-of select="longname" />
<fo:leader leader-pattern="dots" />
<fo:page-number-citation
ref-id="{generate-id(.)}" />
</fo:basic-link>
</fo:block>
<xsl:apply-templates select="chapter" mode="TOC" />
</xsl:template>
请帮助缩进。
答案 0 :(得分:2)
为了简化这种情况,让我们考虑一个带文本输出的样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/xml">
<TOC>
<xsl:apply-templates select="chapter" mode="TOC"/>
</TOC>
</xsl:template>
<xsl:template match="chapter" mode="TOC">
<xsl:call-template name="indent">
<xsl:with-param name="amount" select="count(ancestor::chapter)"/>
</xsl:call-template>
<xsl:number format="1. " level="multiple"/>
<xsl:value-of select="long-name" />
<xsl:text> </xsl:text>
<xsl:apply-templates select="chapter" mode="TOC" />
</xsl:template>
<xsl:template name="indent">
<xsl:param name="amount"/>
<xsl:param name="char" select="'	'"/>
<xsl:if test="$amount">
<xsl:value-of select="$char"/>
<!-- recursive call -->
<xsl:call-template name="indent">
<xsl:with-param name="amount" select="$amount - 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于(更正)的输入:
<?xml version="1.0" encoding="UTF-8"?>
<xml>
<chapter>
<long-name>Chapter 1</long-name>
<chapter>
<long-name>Chapter A</long-name>
<chapter>
<long-name>Chapter B</long-name>
</chapter>
</chapter>
<chapter>
<long-name>Chapter C</long-name>
</chapter>
</chapter>
<chapter>
<long-name>Chapter 2</long-name>
<chapter>
<long-name>Chapter D</long-name>
</chapter>
<chapter>
<long-name>Chapter E</long-name>
</chapter>
</chapter>
</xml>
产生以下结果:
1. Chapter 1
1.1. Chapter A
1.1.1. Chapter B
1.2. Chapter C
2. Chapter 2
2.1. Chapter D
2.2. Chapter E