2010-01-28 59 views
2

屬性我有所需的<font>標籤具有屬性名稱,link='notusing'需要和replaced_with(它應該是可選的唯一link值不是'notusing'一個字符串)。XSD用於元件必須具有取決於另一屬性值

此外,XSD還必須檢查xml是否具有在replaced_with中指定的名稱的字體。

例子:

<fonts> 
    <font name='font1' link='inuse'/> 
    <font name='font2' link='inuse'/> 
    <font name='font3' link='notusing' replaced_with="font2"/> 
</fonts> 

我怎麼能寫這樣的XSD?謝謝

回答

2

我不認爲有可能強制執行replaced_with只能發生如果link='notusing'。你可以使replaced_with可選使用minOccurs='0',但就是這樣。

如果你能夠改變的XML文件的結構,你可以做這樣的事情,而不是:

<?xml version="1.0" encoding="utf-8" ?> 
<fontData 
    xmlns="someNamespace" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="someNamespace XMLSchema1.xsd"> 
    <fonts> 
    <font name="font1" /> 
    <font name="font2" /> 
    </fonts> 
    <obsoleteFonts> 
    <font name="font3" replaced_with="font2" /> 
    </obsoleteFonts> 
</fontData> 

然後你可以使用keykeyref執行任何fontobsoleteFonts的名字存在於fonts中。

這裏的XSD文件會怎麼看待強制執行此XML格式:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema 
    xmlns="someNamespace" 
    xmlns:tns="someNamespace" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="someNamespace" 
    elementFormDefault="qualified"> 
    <xs:element name="fontData" type="fontData"> 
    <xs:key name="fontKey"> 
     <xs:selector xpath="tns:fonts/tns:font" /> 
     <xs:field xpath="@name" /> 
    </xs:key> 
    <xs:keyref name="obsoleteFontToFontKeyRef" refer="fontKey"> 
     <xs:selector xpath="tns:obsoleteFonts/tns:font" /> 
     <xs:field xpath="@replaced_with" /> 
    </xs:keyref> 
    </xs:element> 
    <xs:complexType name="fontData"> 
    <xs:sequence> 
     <xs:element name="fonts" type="fonts" /> 
     <xs:element name="obsoleteFonts" type="obsoleteFonts" /> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="fonts"> 
    <xs:sequence> 
     <xs:sequence> 
     <xs:element name="font" type="font" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="obsoleteFonts"> 
    <xs:sequence> 
     <xs:sequence> 
     <xs:element name="font" type="obsoleteFont" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="font"> 
    <xs:attribute name="name" type="xs:string" /> 
    </xs:complexType> 
    <xs:complexType name="obsoleteFont"> 
    <xs:attribute name="name" type="xs:string" /> 
    <xs:attribute name="replaced_with" type="xs:string" /> 
    </xs:complexType> 
</xs:schema> 

我與Visual Studio架構驗證測試這一點,但希望它會在任何技術使用的是正常工作。

0

在XML模式(XSD)中,您不能表達這種要求/限制。 XML模式完全是關於結構的,您不能使用元素或屬性的值來影響其他元素或屬性的結構。無法完成,這只是XML模式標準的一部分。

如果您需要此類檢查,請查看Schematron,這是一種不同類型的XML驗證框架。

相關問題