将 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,当这是一个 Part 有 Chapters 作为子节点(见下文),但不是当它只是部分,没有任何章节,在这样的书中:
<?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】:
要使模板仅匹配包含chapter
的part
,请将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 参数的主要内容,如果未能解决你的问题,请参考以下文章