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

XSLT 3匹配XML文档元素及xsl:mode on-no-match="fail"使用问题

XSLT 3中文档元素匹配与xsl:mode on-no-match="fail"的使用问题

我有一份测试XML文件:

<?xml version="1.0" encoding="utf-8"?>
<foo>
  <bar>test</bar>
</foo>

初始可正常运行的XSLT模板

使用以下XSLT 3模板时,因匹配了根节点,输出符合预期:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>
  <xsl:mode on-no-match="fail"/>

  <xsl:template match="/">
    This is a test.
  </xsl:template>
</xsl:stylesheet>

输出结果:

This is a test.

匹配文档元素失败的场景

当尝试用绝对路径/foo匹配文档元素时:

…
  <xsl:template match="/foo">
…

匹配失败,Saxon 12.2抛出错误:

XTDE0555 No user-defined template rule in the unnamed mode matches the node /

使用相对路径match="foo"同样无法匹配到文档元素。

添加通用匹配模板后的成功场景

修改模板,添加一个通用元素匹配模板后,/foo可以成功匹配文档元素:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="/foo">
    This is a test.
  </xsl:template>

 <xsl:template match="*">
  <xsl:message terminate="no">
   WARNING: Unmatched element: <xsl:value-of select="name()"/>
  </xsl:message>
  
  <xsl:apply-templates/>
 </xsl:template>

</xsl:stylesheet>

该模板成功输出:

This is a test.

且未触发任何警告,说明/foo确实匹配到了<foo>文档元素。

疑问

  1. 在XSLT 3中,如何使用绝对XPath表达式匹配XML文档的文档元素?
  2. 我希望实现“无匹配规则时直接失败,而非默认输出整个文档文本”的效果,请问第一个示例中的<xsl:mode on-no-match="fail"/>是否使用正确?

内容的提问来源于stack exchange,提问作者Garret Wilson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:03:32