gpt4 book ai didi

XML、XSD xs :keyref within recursive complex type defintion

转载 作者:行者123 更新时间:2023-12-04 05:36:59 25 4
gpt4 key购买 nike

我有一些 xml 数据,顶部有一个允许类型的列表,以及一个引用允许类型的对象和子对象的递归列表类型:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KEYREF_TEST.xsd">
<ALLOWED_SHAPE_TYPES>
<SHAPE_TYPE>Circle</SHAPE_TYPE>
<SHAPE_TYPE>Triangle</SHAPE_TYPE>
<SHAPE_TYPE>Square</SHAPE_TYPE>
</ALLOWED_SHAPE_TYPES>
<SHAPES>
<SHAPE>
<TYPE>Triangle</TYPE>
<SUB_SHAPES>
<SHAPE>
<TYPE>Circle</TYPE>
<SUB_SHAPES/>
</SHAPE>
<SHAPE>
<TYPE>Square</TYPE>
<SUB_SHAPES>
<SHAPE>
<TYPE>Triangle</TYPE>
<SUB_SHAPES/>
</SHAPE>
</SUB_SHAPES>
</SHAPE>
</SUB_SHAPES>
</SHAPE>
<SHAPE>
<TYPE>Square</TYPE>
<SUB_SHAPES/>
</SHAPE>
</SHAPES>
</ROOT>

我已定义验证此文档的架构如下:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ROOT">
<xs:complexType>
<xs:sequence>
<xs:element name="ALLOWED_SHAPE_TYPES">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="SHAPE_TYPE" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SHAPES" type="shape-list-type"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="SHAPE_TYPE_UK">
<xs:selector xpath="ALLOWED_SHAPE_TYPES/SHAPE_TYPE"/>
<xs:field xpath="."/>
</xs:unique>
</xs:element>
<xs:complexType name="shape-list-type">
<xs:sequence>
<xs:element name="SHAPE" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="TYPE" type="xs:string">
<xs:keyref name="SHAPE_TYPE_FK" refer="SHAPE_TYPE_UK">
<xs:selector xpath="."></xs:selector>
<xs:field xpath="."></xs:field>
</xs:keyref>
</xs:element>
<xs:element name="SUB_SHAPES" type="shape-list-type"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>

在 oXygen 13.2 中验证时,出现以下错误:
System ID: C:\pvcswork\CodeSource\XMLSchema\KEYREF_DATA.xml
Main validation file: C:\pvcswork\CodeSource\XMLSchema\KEYREF_DATA.xml
Schema: C:\pvcswork\CodeSource\XMLSchema\KEYREF_TEST.xsd
Engine name: Xerces
Severity: error
Description: Identity Constraint error: identity constraint "KeyRef@1df2ead" has a keyref which refers to a key or unique that is out of scope.
Start location: 10:28

我相信这是因为 xs:keyref 是 xs:complexType 定义的子元素,它不是 xs:element 的子元素,其中定义了 xs:unique。

我可以将 xs:keyref 移到 ROOT 定义中并使用 XPath 定位 TYPE 元素,但是不允许使用//语法,因此我会丢失递归并且必须为每个嵌套级别定义一个新的 xs:keyref。 ** UPDATE -//允许在 XPath 的开头,以点开头! **

是否有我错过的解决方案(仍在使用 XSD)?提前致谢..

最佳答案

下面的 XSD 将是我对您问题的解决方案。我基本上修复了一些选择器并将它们放在同一级别。

QTAssistant showing unique/keyref

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ROOT">
<xs:complexType>
<xs:sequence>
<xs:element name="ALLOWED_SHAPE_TYPES">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="SHAPE_TYPE" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SHAPES" type="shape-list-type"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="SHAPE_TYPE_UK">
<xs:selector xpath="ALLOWED_SHAPE_TYPES/SHAPE_TYPE"/>
<xs:field xpath="."/>
</xs:unique>
<xs:keyref name="SHAPE_TYPE_FK" refer="SHAPE_TYPE_UK">
<xs:selector xpath=".//SHAPE/TYPE"></xs:selector>
<xs:field xpath="."></xs:field>
</xs:keyref>
</xs:element>
<xs:complexType name="shape-list-type">
<xs:sequence>
<xs:element name="SHAPE" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="TYPE" type="xs:string"/>
<xs:element name="SUB_SHAPES" type="shape-list-type"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>

关于XML、XSD xs :keyref within recursive complex type defintion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11798902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com