我有一个无序的元素列表,其中包含xs:any,尝试了多种选择和序列组合,它们都违反了" Unique Particle Attribution" 。 我的xml如下:
<mall id="Andaal">
<eff>effRecorder</eff>
<morr>id</morr>
<todd>toddCurrentType == toddIdOldType</todd>
<mall id="donAllId">
<morr>id</morr>
<eff>effRecorder</eff>
<other>QuickCode</other>
<mall id="mall2Id">
<eff>TickerChainEff</eff>
<morr>SourceId</morr>
<other>TickerCode</other>
</mall>
</mall>
<mall id="mall2SourceId">
<eff>Listing2SourceEff</eff>
<morr>id</morr>
<other>other2Price</other>
<other>ExpiryDate</other>
</mall>
</mall>
xsd代码:
<xs:element name="mall" maxOccurs="unbounded" minOccurs="0">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element type="xs:string" name="eff" minOccurs="0"/>
<xs:element type="xs:string" name="todd" minOccurs="0"/>
<xs:element type="xs:string" name="morr" minOccurs="1"/>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xs:sequence>
<xs:attribute name="id" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z_]+"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
请注意,元素eff
,todd
和morr
可以按任何顺序出现,并且它们可以在另一个mall
元素内的层次结构中更深层次出现。
答案 0 :(得分:3)
XSD 1.0
使用XSD 1.0无法实现。基本上,解析器需要能够拾取每个元素并给出其当前状态(明确地)它应该使用哪个模式元素来验证它。它不支持任何形式的展望。通过引入任何,你提供歧义,任何将匹配现有的eff,todd,morr元素,这可以通过向前看解决,但不支持。
所以你得到的最好的就是这个
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="mall">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="eff" type="xs:string" minOccurs="0" />
<xs:element name="todd" type="xs:string" minOccurs="0" />
<xs:element name="morr" type="xs:string" minOccurs="0" />
<xs:any minOccurs="0" namespace="##other" processContents="lax" />
</xs:choice>
<xs:attribute name="id" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z_]+" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
any 被约束为任何不是当前targetnamespace的命名空间。这可以防止模糊和一切都行。
除了....现在你有一个允许0-n eff,todd,morr元素的模式。所以它远非完美。
XSD 1.1
您可以使用openContent元素使用XSD 1.1完成您正在尝试的操作。
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="mall">
<xs:complexType mixed="true">
<xs:openContent mode="interleave">
<xs:any processContents="lax" />
</xs:openContent>
<xs:all>
<xs:element name="eff" type="xs:string" minOccurs="0" />
<xs:element name="todd" type="xs:string" minOccurs="0" />
<xs:element name="morr" type="xs:string" minOccurs="1" />
</xs:all>
<xs:attribute name="id" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z_]+" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
这强制执行基于eff,todd&amp; amp;的基数规则。 morr同时允许你在它们之间加入任何其他内容,即
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com) -->
<mall xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Schema11.xsd" id="_Mi___XW">
<OTHER></OTHER>
<eff>string</eff>
<OTHER></OTHER>
<todd>string</todd>
<OTHER></OTHER>
<morr>string</morr>
<OTHER></OTHER>
</mall>
缺点是XSD 1.1还没有被widley支持,Xerces和其他一些解析器支持它,但不是很多。
<强>更新强>
更新以反映Michael Kay的评论。正如迈克尔指出的那样,XSD 1.1现在可以解决任何和命名元素之间的歧义。结果更简单。
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="mall">
<xs:complexType mixed="true">
<xs:all>
<xs:element name="eff" type="xs:string" minOccurs="0" />
<xs:element name="todd" type="xs:string" minOccurs="0" />
<xs:element name="morr" type="xs:string" minOccurs="1" />
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xs:all>
<xs:attribute name="id" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z_]+" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>