将 xsl:apply-templates 转换为字符串值以用作 if 参数

Posted

技术标签:

【中文标题】将 xsl:apply-templates 转换为字符串值以用作 if 参数【英文标题】:Converting an xsl:apply-templates into a string value to use as an if parameter 【发布时间】:2016-07-01 11:22:10 【问题描述】:

我有这段代码,修改自 DITA-OT 原始发行版:

<xsl:template match="*[contains(@class, ' topic/topic ')]" mode="in-this-section-chapter-list">
    <fo:block margin-left="6em">
        <fo:block>
            <xsl:call-template name="insertVariable">
                <xsl:with-param name="theVariableID" select="'Chapter with number'"/>
                <xsl:with-param name="theParameters">
                    <number>
                        <fo:inline>
                            <xsl:apply-templates select="key('map-id', @id)[1]"
                                mode="topicTitleNumber"/>
                        </fo:inline>
                    </number>
                </xsl:with-param>
            </xsl:call-template>
        </fo:block>
    </fo:block>
</xsl:template>

我试图只执行/打印这个 mini-toc,当这是一个 PartChapters 作为子节点(见下文),但不是当它只是部分,没有任何章节,在这样的书中:

<?xml version="1.0" encoding="utf-8"?>
<bookmap>
<part>
    <chapter/>
    <chapter/>
    <chapter/>
</part>
<part/>
<part/>
<part/>
<part/>
<appendix/>
</bookmap>

所以在这种情况下,只有第一个 会执行/打印这个。

我认为将 中的值作为文本传递, 将允许我添加一个 if 基本上将测试一个不为空的值,从而执行此操作。但它没有奏效。

我想出了这样的东西,这是无效的:

<xsl:template match="*[contains(@class, ' topic/topic ')]" mode="in-this-section-chapter-list">

<xsl:with-param name="value-number">
    <xsl:apply-templates select="key('map-id', @id)[1]"
        mode="topicTitleNumber"/>
</xsl:with-param>

<xsl:if test="$value-number!=''">
    <fo:block margin-left="6em">
        <fo:block>
            <xsl:call-template name="insertVariable">
                <xsl:with-param name="theVariableID" select="'Chapter with number'"/>
                <xsl:with-param name="theParameters">
                    <number>
                        <fo:inline>
                            <xsl:apply-templates select="key('map-id', @id)[1]"
                                mode="topicTitleNumber"/>
                        </fo:inline>
                    </number>
                </xsl:with-param>
            </xsl:call-template>
        </fo:block>
    </fo:block>
</xsl:if>
</xsl:template>

【问题讨论】:

要说些什么,至少需要 map-id 的键声明和使用的带有mode="topicTitleNumber" 的模板。猜测是这个模板会生成一些 xml。如果没有 xslt 扩展名,则不能将其用作文本。 【参考方案1】:

要使模板仅匹配包含chapterpart,请将match="*[contains(@class, ' topic/topic ')]" 更改为match="part[chapter][contains(@class, ' topic/topic ')]"

如果谓词对于您感兴趣的每个 part 都为真,那么您可能不再需要 [contains(@class, ' topic/topic ')]。如果它对于任何part你感兴趣的。

【讨论】:

【参考方案2】:

如果您想要章节级别的 minitoc,您可能还需要添加一个 OR 以便选择章节。

【讨论】:

以上是关于将 xsl:apply-templates 转换为字符串值以用作 if 参数的主要内容,如果未能解决你的问题,请参考以下文章

xsl:apply-templates 模板的应用

使用 `<xsl:apply-templates>` 排序后缺少一些子节点

身份转换

XSL-FO - 空块元素

关于xls的一点笔记

XSLT中的内置模板