我有一个<font>
标记,其中包含所需的属性名称,link='notusing'
和replaced_with
(它应该是可选的link
值不是{{1}的字符串})。
XSD还必须检查xml是否包含'notusing'
中指定名称的字体。
示例:
replaced_with
我如何为此编写XSD?感谢
答案 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>
然后,您可以使用key
和keyref
来强制font
中obsoleteFonts
中fonts
内的任何<?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验证框架。