基于Saxon HE 10.6使用XSLT 3.0 xsl:mode实现XML元素过滤的问题
问题根因
你的初始脚本存在三个核心问题:
on-no-match="shallow-skip"配置下,根节点<bill>无匹配模板直接被跳过,导致无任何输出- 匹配规则
item/*[status=0]和空模板组合,效果是删除符合条件的节点,与保留目标节点的需求完全相反 - 未声明XSLT命名空间,部分场景下会导致解析异常
正确实现
直接用以下简洁的XSLT 3.0脚本即可实现需求:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:mode on-no-match="shallow-copy" /> <!-- 匹配所有不满足条件的item节点,直接跳过不输出 --> <xsl:template match="item[not(shoes/status = 0)]" /> </xsl:stylesheet>
逻辑说明
on-no-match="shallow-copy"会让所有未显式匹配的节点执行浅拷贝:复制当前节点本身,继续递归处理子节点,保证原XML结构完整保留- 显式声明的模板仅匹配
shoes/status值不等于0的item节点,空模板表示直接丢弃这些节点及其子内容,无需额外处理 - 你当前使用的
BasicTransformerFactory初始化方式完全兼容该脚本,无需修改Java端代码
内容的提问来源于stack exchange,提问作者Huub
相关产品推荐
相关产品推荐

