我有一个 kml xml 实例,它可以在某些引擎上正常验证,但在其他引擎上验证失败哪一个是对的?

问题描述

我有一个 kml xml 实例,它可以在所有 microsoft xml 引擎上正常验证,但在我尝试过的所有其他引擎上验证失败。 xsd ogckml22.xsd 中的相关元素;

<element name="LinestringSimpleExtensionGroup" type="anySimpleType" abstract="true"/>

    <complexType name="LinestringType" final="#all">
        <complexContent>
            <extension base="kml:AbstractGeometryType">
                <sequence>
                    <element ref="kml:extrude" minOccurs="0"/>
                    <element ref="kml:tessellate" minOccurs="0"/>
                    <element ref="kml:altitudeModeGroup" minOccurs="0"/>
                    <element ref="kml:coordinates" minOccurs="0"/>
                    <element ref="kml:LinestringSimpleExtensionGroup" minOccurs="0" maxOccurs="unbounded"/>
                    <element ref="kml:LinestringObjectExtensionGroup" minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>

一个实例(仅相关部分);

<Linestring>
    <tessellate>1</tessellate>
    <gx:altitudeMode>relativetoSeaFloor</gx:altitudeMode>
    <coordinates>3.32001280049665,6.572382963895447</coordinates>
    <LinestringSimpleExtensionGroup xsi:type="xsd:int">66</LinestringSimpleExtensionGroup>
</Linestring>

使用 VS2019 我没有得到验证错误。使用 Stylus Studio 和 MSXML4/6 我没有得到验证错误。 我使用 Stylus Studio 和 Java; (错误)cvc-elt.2:'LinestringSimpleExtensionGroup' 的元素声明中 {abstract} 的值必须为 false。

正在运行自定义验证引擎 Saxonica 9.4.0.6 Validator...

XtraElems.kml 第 150 行第 55 列 /kml[1]/Document[1]/Placemark[1]/Linestring[1]/LinestringSimpleExtensionGroup[1] 处的验证错误: 在元素的内容:无效元素: 元素被声明为抽象文件 file:///k:/Samples/XtraElems.kml 验证不成功。

这似乎是正确的,意思是所有的 microsoft 解析器都不正确?肯定不是!

额外的问题 - 如果永远无法使用,那么将所有这些抽象元素放在 kml 中到底有什么意义? (而且有很多!)

解决方法

Microsoft 架构处理器多年未更新。有很多地方他们要么一开始就选择不符合规范(例如,他们实现了自己的正则表达式方言而不是 W3C 方言)、报告了错误但未修复的地方,或者规范已被修复的地方澄清,他们没有更新他们的实施。微软提交给 W3C 的相当多的测试用例——大概是他们自己的处理器通过了——已经被其他供应商质疑并被发现是不正确的。

规范很清楚(一旦你掌握了语言!):

Validation Rule: Element Locally Valid (Element)

For an element information item E to be locally ·valid· with respect to an element declaration D all of the following must be true:
1 D is not ·absent· and E and D have the same expanded name.
2 D.{abstract} = false.
...

基本上,如果声明具有替换组,并且元素名称与替换组的成员匹配,则您只能对抽象元素声明有效。一个经典的例子是 <history> 元素包含一系列抽象的 <event> 元素,其中具体的事件元素可能是 <birth><death><marriage> 等:因为<event>是抽象的,不能直接使用,只能使用具体的替换。

我不熟悉 KML 架构设计,因此无法为您提供帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...