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>文档元素。
疑问
- 在XSLT 3中,如何使用绝对XPath表达式匹配XML文档的文档元素?
- 我希望实现“无匹配规则时直接失败,而非默认输出整个文档文本”的效果,请问第一个示例中的
<xsl:mode on-no-match="fail"/>是否使用正确?
内容的提问来源于stack exchange,提问作者Garret Wilson
相关产品推荐
相关产品推荐

