XSLT中“终止模板执行”并非传统编程中的return或exit,而是通过条件判断、模板匹配、apply-templates控制等方式实现流程调控。使用xsl:if或xsl:choose可基于条件决定是否输出内容,实现局部“终止”;通过定义空模板或不匹配特定节点,可“静默”跳过某些元素;xsl:message terminate="yes"则用于全局终止整个转换过程,通常在严重错误时使用;而select和mode属性可精细控制模板应用范围,实现局部处理的“跳过”而非真正终止。因此,XSLT中的“终止”更多体现为声明式流程控制,而非命令式中断。

XSLT中“终止模板执行”这个说法,其实和我们平时写程序时理解的
return
exit
当我们谈论“终止”时,其实是在寻找如何精细控制XSLT转换流程的方法。以下是一些我认为最直接和常用的策略,它们各有侧重:
利用条件判断(xsl:if
xsl:choose
xsl:if
xsl:choose/xsl:when
<xsl:template match="item">
<xsl:if test="@status = 'active'">
<activeItem>
<xsl:value-of select="title"/>
</activeItem>
</xsl:if>
<!-- 如果status不是active,这里就什么都不会输出 -->
</xsl:template>或者更复杂的场景:
<xsl:template match="data">
<xsl:choose>
<xsl:when test="count(children) > 0">
<!-- 处理有子节点的情况 -->
<parent>
<xsl:apply-templates select="children"/>
</parent>
</xsl:when>
<xsl:otherwise>
<!-- 没有子节点,这里就“什么都不做”,相当于终止了对子节点处理的意图 -->
<!-- 或者可以输出一个占位符 -->
<emptyData/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>通过匹配模式和优先级(xsl:template
match
<!-- 默认模板,处理所有元素和文本节点 -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- 专门匹配并“忽略”某个元素 -->
<xsl:template match="secretInfo"/>
<!-- 当遇到<secretInfo>时,这个空模板会被应用,什么也不会输出,
从而有效地“终止”了它及其内容的输出 -->这里,
secretInfo
使用 xsl:message terminate="yes"
<xsl:template match="/">
<xsl:if test="not(root/requiredElement)">
<xsl:message terminate="yes">
错误:输入XML缺少必需的'requiredElement'。转换已终止。
</xsl:message>
</xsl:if>
<!-- 如果没有终止,则继续正常转换 -->
<output>
<xsl:apply-templates/>
</output>
</xsl:template>这种方式非常强硬,一旦触发,整个转换进程都会停止,并通常会抛出一个错误信息。
精细化 xsl:apply-templates
select
mode
xsl:apply-templates
select
mode
<xsl:template match="section">
<sectionOutput>
<!-- 只处理status为'published'的paragraph,其他paragraph被“终止”处理 -->
<xsl:apply-templates select="paragraph[@status='published']"/>
</sectionOutput>
</xsl:template>在XSLT的语境里,“终止”和“跳过”虽然听起来相似,但在实际操作和语义上,我认为有明显的层次差异。当我们谈论“跳过”,通常指的是对某个特定的节点或一组节点,我们选择不进行任何处理或输出,让它们“消失”在最终结果中。这可以通过不编写匹配模板,或者编写一个空的匹配模板来实现。它是一种局部性的、针对特定数据元素的策略。比如,你有一份包含敏感信息的XML,你只想在转换时把这些敏感字段完全剔除,这就是“跳过”——它们不会触发任何输出,也不会影响其他部分的正常处理。
而“终止”则显得更强硬,尤其是在涉及到
xsl:message terminate="yes"
所以,我的理解是,“跳过”是一种精细的、声明式的控制,用于排除某些不想要的输出;而“终止”则是一种全局性的、通常是错误处理机制,用于在特定条件下完全停止整个转换任务。两者在目的和影响范围上都有着本质的区别。
在不使用
terminate="yes"
首先,xsl:if
xsl:choose
<product>
@status
<xsl:template match="product">
<xsl:choose>
<xsl:when test="@status = 'available'">
<availableProduct>
<name><xsl:value-of select="name"/></name>
<price><xsl:value-of select="price"/></price>
</availableProduct>
</xsl:when>
<xsl:when test="@status = 'discontinued'">
<discontinuedProduct name="{name}"/>
</xsl:when>
<xsl:otherwise>
<!-- 对于其他状态,什么也不输出,或者输出一个通用的占位符 -->
<unknownProductStatus name="{name}"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>在这里,不同的条件决定了不同的输出分支,或者干脆没有输出(如果
xsl:otherwise
其次,xsl:apply-templates
select
<data>
<record>
<log>
<xsl:template match="data">
<dataOutput>
<!-- 只处理record子节点,忽略log等其他子节点 -->以上就是XSLT如何终止模板执行?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号