2010-01-28 50 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验证框架。

相关问题