应用于不同 xsi 命名空间的 Schematron

Schematron applied to different xsi namespaces

我们有一个 schematron,其 xsi 命名空间声明如下

   <schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding='xslt2'>
   <ns prefix="xsi" uri="http://www.w3.org/2001/XMLSchema-instance"/>

我们这样做是因为我们想定义基于上下文的规则如下:

    <rule context="*[@xsi:type='DATA_TYPE']">...</rule>

这些规则适用于我们目前收到的过去 XML 个文件。但是,我们最近收到了一个 XML 其 xsi 命名空间定义为:

xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" 

这个 'new' xsi 命名空间导致上面定义的规则不被触发(因为规则不共享相同的 xsi)。有没有一种方法可以以独立于 xsi 命名空间触发规则的方式定义 schematron 命名空间?

总是可以选择基于 local-name()="type" 而不是使用 xsi:type 来定义规则,但我想知道是否有正确的(更好的) ) 的实现方式。

这是来自旧规范的 XMLSchema-instance 命名空间的一个版本。

您可以为其添加另一个前缀声明:

<ns prefix="xsi_old" uri="http://www.w3.org/2000/10/XMLSchema-instance"/>

然后调整您的规则以测试两者:

<rule context="*[@xsi:type='DATA_TYPE' or @xsi_old:type='DATA_TYPE']">...</rule>