用于递归元素定义的 XSD [英] XSD for recursive element definition

查看:33
本文介绍了用于递归元素定义的 XSD的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个案例,我需要一个元素来嵌套自己或拥有其他元素.

这样的事情应该是有效的:

Something like this should be valid:

<root>
  <rule condition="...">
    <rule condition="...">
      <setting>...</setting>
    </rule>
  </rule>
  <rule condition="...">
    <setting>...</setting>
  </rule>
</root>

但这应该是有效的:

<root>
  <rule condition="...">
    <rule condition="...">
      <setting>...</setting>
    </rule>
    <setting>...</setting>
    <setting>...</setting>
  </rule>
</root>

如果我正确理解 XSD,这应该可以完成工作,但事实并非如此.我做错了什么?

If I understand XSD correctly this should do the job but it doesn't. What am I doing wrong?

<xs:complexType name="RuleType">
    <xs:choice>
        <xs:element name="rule" minOccurs="1" 
                    maxOccurs="unbounded" type="RuleType" />
        <xs:element name="setting" minOccurs="1"
                    maxOccurs="unbounded" type="xs:string" />
    </xs:choice>
    <xs:attribute name="condition" type="xs:string" use="required"/>
</xs:complexType>

推荐答案

此 XSD 将允许您的第一个示例 XML 但不允许您的第二个示例:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="rule" type="RuleType"/>

  <xs:complexType name="RuleType">
    <xs:choice>
      <xs:element name="setting" minOccurs="1" maxOccurs="unbounded" />
      <xs:element ref="rule" minOccurs="1" maxOccurs="unbounded" />
    </xs:choice>
    <xs:attribute name="condition" use="required"/>
  </xs:complexType>

</xs:schema>

像这样读取 XSD: 每个 rule 可以包含一个或多个 setting 元素或一个或多个其他 rule 元素(递归).

Read the XSD like this: Each rule can consist of either one or more setting elements or one or more other rule elements (recursively).

这篇关于用于递归元素定义的 XSD的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆