Xml 模式中 XML 元素的相关命名
Dependent naming of XML element in Xml Schema
假设我有这个 XML:
<parameters>
<parameter type="string" isVisible="True" optional="False" id="DealerCode">
<DealerCode>ABCDEF001</DealerCode>
</parameter>
</parameters>
我使用 Xml-Schema 生成器为我生成了一个基本的。结果是:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:element name="DealerCode" type="xs:string"/>
<xs:element name="parameter">
<xs:complexType>
<xs:sequence>
<xs:element ref="DealerCode"/>
</xs:sequence>
<xs:attribute type="xs:string" name="type"/>
<xs:attribute type="xs:string" name="isVisible"/>
<xs:attribute type="xs:string" name="optional"/>
<xs:attribute type="xs:string" name="id"/>
</xs:complexType>
</xs:element>
<xs:element name="parameters">
<xs:complexType>
<xs:sequence>
<xs:element ref="parameter"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
元素 DealerCode 的命名取决于 parameter 元素的 identifier .例如,如果 parameter 具有 identifier ZIP
,parameter 的子元素也应该这样命名。如何在 Xml-Schema 中实现此目的?
示例:
<parameter type="string" isVisible="True" optional="False" id="DealerCode">
<DealerCode>ABCDEF001</DealerCode>
</parameter>
<parameter type="string" isVisible="True" optional="False" id="ZIP">
<ZIP>ABCDEF001</ZIP>
</parameter>
XSD 1.0
不可能。选项:
- 使用
xs:any
并检查关于 XSD 的带外。
通过将通用 parameter
替换为它包装的特定元素来重新设计您的 XML:
<DealerCode type="string" isVisible="True"
optional="False">ABCDEF001</DealerCode>
XSD 1.1
可能使用 xs:assert
:
<xs:assert test="*/local-name() = @id"/>
这是在您完整的 XSD 的上下文中,它将成功验证您的 XML:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="DealerCode" type="xs:string"/>
<xs:element name="parameter">
<xs:complexType>
<xs:sequence>
<xs:any/>
</xs:sequence>
<xs:attribute type="xs:string" name="type"/>
<xs:attribute type="xs:string" name="isVisible"/>
<xs:attribute type="xs:string" name="optional"/>
<xs:attribute type="xs:string" name="id"/>
<xs:assert test="*/local-name() = @id"/>
</xs:complexType>
</xs:element>
<xs:element name="parameters">
<xs:complexType>
<xs:sequence>
<xs:element ref="parameter" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
假设我有这个 XML:
<parameters>
<parameter type="string" isVisible="True" optional="False" id="DealerCode">
<DealerCode>ABCDEF001</DealerCode>
</parameter>
</parameters>
我使用 Xml-Schema 生成器为我生成了一个基本的。结果是:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:element name="DealerCode" type="xs:string"/>
<xs:element name="parameter">
<xs:complexType>
<xs:sequence>
<xs:element ref="DealerCode"/>
</xs:sequence>
<xs:attribute type="xs:string" name="type"/>
<xs:attribute type="xs:string" name="isVisible"/>
<xs:attribute type="xs:string" name="optional"/>
<xs:attribute type="xs:string" name="id"/>
</xs:complexType>
</xs:element>
<xs:element name="parameters">
<xs:complexType>
<xs:sequence>
<xs:element ref="parameter"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
元素 DealerCode 的命名取决于 parameter 元素的 identifier .例如,如果 parameter 具有 identifier ZIP
,parameter 的子元素也应该这样命名。如何在 Xml-Schema 中实现此目的?
示例:
<parameter type="string" isVisible="True" optional="False" id="DealerCode">
<DealerCode>ABCDEF001</DealerCode>
</parameter>
<parameter type="string" isVisible="True" optional="False" id="ZIP">
<ZIP>ABCDEF001</ZIP>
</parameter>
XSD 1.0
不可能。选项:
- 使用
xs:any
并检查关于 XSD 的带外。 通过将通用
parameter
替换为它包装的特定元素来重新设计您的 XML:<DealerCode type="string" isVisible="True" optional="False">ABCDEF001</DealerCode>
XSD 1.1
可能使用 xs:assert
:
<xs:assert test="*/local-name() = @id"/>
这是在您完整的 XSD 的上下文中,它将成功验证您的 XML:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="DealerCode" type="xs:string"/>
<xs:element name="parameter">
<xs:complexType>
<xs:sequence>
<xs:any/>
</xs:sequence>
<xs:attribute type="xs:string" name="type"/>
<xs:attribute type="xs:string" name="isVisible"/>
<xs:attribute type="xs:string" name="optional"/>
<xs:attribute type="xs:string" name="id"/>
<xs:assert test="*/local-name() = @id"/>
</xs:complexType>
</xs:element>
<xs:element name="parameters">
<xs:complexType>
<xs:sequence>
<xs:element ref="parameter" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>