使用Java Saxon转换XHTML时XPath无匹配结果的求助
可能的问题及解决方法
命名空间未正确处理
XHTML属于http://www.w3.org/1999/xhtml命名空间,在线XPath工具常自动忽略命名空间匹配,但Saxon会严格遵循XML命名空间规则。解决方式:- 在XSLT根元素中声明命名空间前缀:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml"> - 所有XPath表达式中使用该前缀匹配元素,比如将
//table改为//xhtml:table。
- 在XSLT根元素中声明命名空间前缀:
XPath上下文节点错误
根模板的上下文是文档节点(/),如果你的XPath是相对路径(比如table),只会匹配文档节点的直接子元素,而XHTML的表格通常嵌套在html/body下。需调整XPath为绝对路径,比如//xhtml:body/xhtml:table,或者在根模板中先定位到正确的上下文节点。XPath版本兼容性问题
部分在线工具默认使用XPath 1.0,而Saxon HE 12.4默认支持XPath 3.1。如果你的XPath依赖1.0的隐式转换(比如节点集处理),在高版本XPath中可能行为不同。可在XSLT中显式指定XPath版本:<xsl:stylesheet version="1.0" ...>或调整XPath适配3.1规则。
文档解析异常
检查XHTML文件是否存在格式错误(比如未闭合标签、命名空间声明缺失),Saxon对XML格式的严格性高于部分在线工具。可先用xmllint或Saxon自带的验证工具检查文档有效性。
内容的提问来源于stack exchange,提问作者Sloth404
相关产品推荐
相关产品推荐

