You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XSL选择Docbook XML节点并排除第一个simplesect的标题

正确匹配规则实现

你之前的写法失效的核心原因是:你在db:simplesect的模板里直接排除了所有db:title节点,导致后续针对db:title的匹配规则完全没有执行机会,其次是XPath谓词的上下文判断错误。
可以用以下两套方案实现需求,均兼容XSLT 2.0及以上版本:

方案1:用空模板屏蔽不需要的节点(更简洁)

首先确保你的样式表顶部已经声明了DocBook命名空间,示例如下:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:db="http://docbook.org/ns/docbook"
                version="2.0">

然后编写对应的匹配模板:

<!-- 处理section的标题转h3 -->
<xsl:template match="db:section/db:title">
    <h3><xsl:apply-templates/></h3>
</xsl:template>

<!-- 直接屏蔽第一个simplesect的title节点,空模板无输出 -->
<xsl:template match="db:simplesect[1]/db:title"/>

<!-- 其余simplesect的title转h4 -->
<xsl:template match="db:simplesect/db:title">
    <h4><xsl:apply-templates/></h4>
</xsl:template>

<!-- para节点转p标签 -->
<xsl:template match="db:para">
    <p><xsl:apply-templates/></p>
</xsl:template>

<!-- simplesect节点直接处理子节点即可 -->
<xsl:template match="db:simplesect">
    <xsl:apply-templates/>
</xsl:template>

方案2:在应用模板时筛选节点

如果你不想单独写空模板,也可以直接在simplesect的模板里做分支判断:

<xsl:template match="db:simplesect">
    <!-- 仅非第一个simplesect输出title转h4 -->
    <xsl:if test="position() != 1">
        <h4><xsl:value-of select="db:title"/></h4>
    </xsl:if>
    <!-- 所有simplesect都输出para的内容 -->
    <xsl:apply-templates select="db:para"/>
</xsl:template>

两种方案最终输出都和要求的结果完全一致。

内容的提问来源于stack exchange,提问作者Vincent B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:27:04