XSD表示必须具有取决于另一个属性值的属性的元素

时间:2010-01-28 04:26:19

标签: xsd

我有一个<font>标记,其中包含所需的属性名称,link='notusing'replaced_with(它应该是可选的link值不是{{1}的字符串})。

XSD还必须检查xml是否包含'notusing'中指定名称的字体。

示例:

replaced_with

我如何为此编写XSD?感谢

2 个答案:

答案 0 :(得分: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来强制fontobsoleteFontsfonts内的任何<?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> 的名称。

以下是XSD文件强制执行此XML格式的方式:

{{1}}

我使用Visual Studio架构验证器对此进行了测试,但希望它能够在您使用的任何技术中正常运行。

答案 1 :(得分:0)

在XML架构(XSD)中,您无法表达此类要求/限制。 XML模式完全与结构有关,您不能使用元素或属性的值来影响其他元素或属性的结构。无法完成,它只是XML模式标准的一部分。

如果您需要这种检查,请查看Schematron,一种不同类型的XML验证框架。