Schematron中能否将多个命名空间分组绑定统一前缀使用?
方案可行性结论
你期望的「将6个命名空间绑定同一个前缀调用」的操作无法直接实现:XML语法约束中,同一上下文下一个前缀只能对应唯一的命名空间URI,无法把多个不同命名空间同时关联到同一个前缀。但你可以通过两种等效方案实现「同一套规则覆盖6个命名空间、排除剩余2个」的需求,不需要重复编写多套校验逻辑。
具体实现方案
方案1:排除指定命名空间(兼容XPath 1.0处理器)
如果你的Schematron处理器仅支持XPath 1.0,直接匹配目标元素名,同时过滤掉不需要的2个命名空间即可,改造后规则示例如下:
<!-- 头部先声明所有命名空间,exc1、exc2对应你要排除的2个命名空间 --> <ns prefix="exc1" uri="http://example.com/excluded-namespace-1"/> <ns prefix="exc2" uri="http://example.com/excluded-namespace-2"/> <pattern> <rule context="*[local-name()=('para','para-text','block','quote-para','source-para','note-para') and namespace-uri() != namespace-uri(exc1:*) and namespace-uri() != namespace-uri(exc2:*) ]" role="warning"> <report test="text()[contains(.,'www.')]">URL 应当使用 url 标签进行标记</report> </rule> </pattern>
该方案可维护性更高,后续新增需要覆盖的命名空间时不需要修改规则,只要不加入排除列表就能自动命中校验逻辑。
方案2:序列匹配命名空间(适配XPath 2.0+处理器)
如果你的处理器支持XPath 2.0及以上版本,可以直接把需要覆盖的6个命名空间URI放到序列中匹配,规则逻辑更直观:
<pattern> <rule context="*[local-name()=('para','para-text','block','quote-para','source-para','note-para') and namespace-uri() = ('http://example.com/ns1','http://example.com/ns2','http://example.com/ns3','http://example.com/ns4','http://example.com/ns5','http://example.com/ns6') ]" role="warning"> <report test="text()[contains(.,'www.')]">URL 应当使用 url 标签进行标记</report> </rule> </pattern>
你只需要把示例中的命名空间URI替换成你实际用到的6个命名空间即可生效。
内容的提问来源于stack exchange,提问作者Rachel Standish
相关产品推荐
相关产品推荐

