假設我有一個模式來定義文章串列。這些文章中的每一篇都有一個長名稱串列,每種已知語言都有一個。語言是單個長名稱級別的屬性。
我想保證兩件事:
- 語言屬性只能具有幾個預先確定的值之一(使用列舉解決)。
- 在每個長名稱串列中,語言屬性的給定值只能出現一次。對于每篇文章,我只能有一個英文長名、一個德文長名、一個法文長名等。
在另一篇文章(鏈接)之后,我在 longName 級別實作了一個唯一約束。它將滿足#1,但不滿足#2。如果我在同一個 longNames 元素中的 longName 屬性是“EN”的兩倍,它將認為 xml 有效。
原始示例 XML
<article>
<articleNumber>3019</articleNumber>
<longNames>
<longName language="EN">
<description>A French Omelette with Cheese</description>
</longName>
<longName language="FR">
<description>Un omelette DU(???) fromage</description>
</longName>
</longNames>
</article>
原始 XSD 架構
<xs:complexType name="ArticleType">
<xs:sequence>
<xs:element name="articleNumber" type="xs:integer" />
<xs:element type="bl:LongNamesType" name="longNames" />
<xs:element type="bl:ShortNameType" name="shortName" maxOccurs="3" />
<xs:element type="bl:AllergensType" name="allergens" maxOccurs="3" />
<xs:element type="bl:IngredientsType" name="ingredients" maxOccurs="3" />
<xs:element type="bl:PictureType" name="picture" maxOccurs="3" />
<xs:element name="barcode" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LongNamesType">
<xs:sequence>
<xs:element name="longName" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<!-- <xs:element type="bl:LanguageType" name="language" /> -->
<xs:element name="description" type="xs:string" />
</xs:sequence>
<xs:attribute name="language" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="EN" />
<xs:enumeration value="FR" />
<xs:enumeration value="DE" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:unique name="uniqueLongNameLanguage">
<xs:selector xpath="longNames" />
<xs:field xpath="@language" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
誰能幫我弄清楚我做錯了什么?
編輯:感謝 Yitzak Khabinsky 和 ??Michael Kay,我設法找到了以下可行的解決方案。不可否認,它有點混合風格。感謝所有回復的人!
改進的 XSD
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:bl="urn:inventoryinput"
targetNamespace="urn:inventoryinput">
<xs:element name="inventory" type="bl:InventoryType" />
<xs:complexType name="InventoryType">
<xs:sequence>
<xs:element type="bl:ArticleType" name="article" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArticleType">
<xs:sequence>
<xs:element name="articleNumber" type="xs:integer" />
<xs:element ref="bl:longNames" minOccurs="0" />
<xs:element name="barcode" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:element name="longNames">
<xs:complexType>
<xs:sequence>
<xs:element ref="bl:longName" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="uniqueLongNameLanguage">
<xs:selector xpath="bl:longName" />
<xs:field xpath="@language" />
</xs:unique>
</xs:element>
<xs:element name="longName" >
<xs:complexType>
<xs:sequence>
<xs:element name="description" type="xs:string" />
</xs:sequence>
<xs:attribute name="language" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="NL" />
<xs:enumeration value="FR" />
<xs:enumeration value="DE" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
...
重做的 XML 示例
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<inventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:inventoryinput">
<article>
<articleNumber>3019</articleNumber>
<longNames>
<longName language="NL">
<description>DE TROG Ardeens bruin brood Bio 600g</description>
</longName>
<longName language="FR">
<description>DE TROG pain ardennais complet Bio 600g</description>
</longName>
</longNames>
uj5u.com熱心網友回復:
請嘗試以下解決方案。
輸入 XML
<article>
<articleNumber>3019</articleNumber>
<longNames>
<longName language="EN">
<description>A French Omelette with Cheese</description>
</longName>
<longName language="FR">
<description>Un omelette DU(???) fromage</description>
</longName>
</longNames>
</article>
XSD
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="article">
<xs:complexType>
<xs:sequence>
<xs:element ref="articleNumber"/>
<xs:element ref="longNames"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="articleNumber" type="xs:integer"/>
<xs:element name="longNames">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="longName"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="uniqueLongNameLanguage">
<xs:selector xpath="longName"/>
<xs:field xpath="@language"/>
</xs:unique>
</xs:element>
<xs:element name="longName">
<xs:complexType>
<xs:sequence>
<xs:element ref="description"/>
</xs:sequence>
<xs:attribute name="language" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="EN"/>
<xs:enumeration value="FR"/>
<xs:enumeration value="DE"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="description" type="xs:string"/>
</xs:schema>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474971.html
