递归键值对的XML模式
考虑以下XML示例文档,该文档包含具有键-值对(也可以是递归的)的变量:递归键值对的XML模式,xml,recursion,xsd,xsd-1.1,Xml,Recursion,Xsd,Xsd 1.1,考虑以下XML示例文档,该文档包含具有键-值对(也可以是递归的)的变量: <?xml version="1.0" encoding="UTF-8"?> <environments> <variable> <key>Variable 1</key> <value>Value</value> </variable> <variable>
<?xml version="1.0" encoding="UTF-8"?>
<environments>
<variable>
<key>Variable 1</key>
<value>Value</value>
</variable>
<variable>
<value>B</value>
<key>Variable 2</key>
</variable>
<variable>
<value></value>
<key>Variable 2</key>
</variable>
<variable>
<key>Variable 2</key>
<value>
<variable>
<key>Foo</key>
<value>Bar</value>
</variable>
</value>
</variable>
<variable>
<key>Variable 2</key>
<value>
<variable>
<key>Foo</key>
<value>
<variable>
<key>Foo</key>
<value>Bar</value>
</variable>
</value>
</variable>
</value>
</variable>
</environments>
此模式适用于我的示例文档。但是,对于value元素,我非常不确定:。这意味着类似这样的变量元素将被视为有效的,并且在嵌套变量元素之前还有额外的foo字符:
我的问题是:如何确保value元素是另一个变量元素复杂类型还是一个字符串?XSD中的混合内容实际上只适用于叙述性文本文档。除了使用XSD1.1断言之外,您可以对混合内容施加的有效约束很少。如果可以的话,最好避免这种内容模型。我有XSD 1.1可用。您还打算做些什么来实现我所展示的/我所需要的?一种方法是将内容模型作为属性或可变子元素。这对XSD1.1条件类型分配很有好处。我绝对不是XML专家,但使用属性进行这种分配似乎是不正确的设计。您能提供一个如何使用XSD 1.1断言实现这一点的示例吗?我们对这里建模的语义知之甚少,但我没有看到任何迹象表明属性不合适。好吧,几个月的XML经验之后,我对您的答案有了更好的理解-谢谢:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<!-- Element: Environments -->
<xs:element name="environments">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element ref="variable"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Element: variable_type -->
<xs:element name="variable">
<xs:complexType>
<xs:all>
<xs:element ref="key"/>
<xs:element ref="value"/>
</xs:all>
</xs:complexType>
</xs:element>
<!-- Element: key -->
<xs:element name="key" type="xs:string"/>
<!-- Element: value -->
<xs:element name="value">
<xs:complexType mixed="true">
<xs:sequence>
<xs:choice>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="variable"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<variable>
<key>Variable 2</key>
<value>
foo
<variable>
<key>Foo</key>
<value>Bar</value>
</variable>
</value>
</variable>