【发布时间】:2015-09-17 10:07:16
【问题描述】:
我们有一个带有 xsi 命名空间的 schematron,声明如下
<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"
这个“新”xsi 命名空间导致上面定义的规则不被触发(因为规则不共享相同的 xsi)。有没有办法以独立于 xsi 命名空间触发规则的方式定义 schematron 命名空间?
总是可以选择基于 local-name()="type" 而不是使用 xsi:type 来定义规则,但我想知道是否有正确(和更好)的方法来实现这一点。
【问题讨论】:
-
(略略):XSI namespace is reserved。这个“新的”xsi 命名空间根本不是 XSI 命名空间,从验证的角度来看,它只是另一个命名空间。此外,您应该不需要使用您的架构检查此有效性,引用:“这加强了这些属性的特殊状态,因此它们不仅不需要在实例中声明为允许,但不得声明。它还消除了对 xsi:type 或 xsi:nil 等进行实验 [..] 的任何诱惑,因为它们没有任何效果,因此会产生严重的误导。”
-
可能不是那么离题,因为它可以解决问题:)
标签: xml xslt xml-namespaces schematron