如何用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
相关产品推荐
相关产品推荐

