如何在属性上限制父级?

时间:2010-09-03 18:06:47

标签: xsd

看看this example

现在在attribute.xsd中定义了一个性别属性。但据我所知,只要family.xsd具有anyAttribute,我就可以使用此属性。

是否可以根据父母的姓名将性别属性限制为某个父级?

3 个答案:

答案 0 :(得分:0)

通常,只有在特别定义复杂类型以允许所需属性时才允许使用属性。另一方面,只有在您希望在此复杂类型中允许任何属性(可能具有名称空间限制)时,才使用<xs:anyAttribute>

我看到这个问题可以用两种不同的方式解释

  1. 有没有办法使用<xs:anyAttribute>但实际上只允许某种属性
  2. 有没有办法使用<xs:anyAttribute>但不允许某个属性
  3. 实际上我没有任何好的答案,我只有未经测试的黑客。

    案件编号1

    这可以使用namespace上的<xs:anyAttribute>属性来实现。 namespace的默认值为##any,它允许来自任何命名空间或没有命名空间的属性。而不是##任何你可以使用

    1. ##other,它允许任何命名空间属性,但不允许属于模式的目标命名空间的属性
    2. 允许名称空间的以空格分隔的URI列表。此列表还可以包含通配符##targetNamespace(允许来自架构的目标命名空间的属性)和##local(允许没有命名空间的属性)
    3. 似乎不允许仅使用没有命名空间的属性。

      如果架构具有目标命名空间,则所有全局定义的属性都属于该目标命名空间。所以w3schools的例子实际上似乎是不正确的,因为他们在具有目标命名空间的模式中全局定义了属性gender,但他们在没有命名空间前缀的情况下使用它(默认命名空间不适用于属性)。 / p>

      案例编号2

      使用<xs:attribute name="gender" use="prohibited"/>可以 。无法包含use="prohibited"的属性。但是我从未调查过,当<xs:anyAttribute>元素存在时,允许使用这样的属性定义。全局属性定义不允许使用属性use,因此不可能以这种方式全局禁止使用属性。

答案 1 :(得分:0)

我使用<xs:redefine>解决了这个问题,它允许您重新定义类型和组。

答案 2 :(得分:-1)

我对XML技术的了解非常简短,所以请耐心等待。

您可以使用性别(男性|女性)代替其他属性,因为它在语法上是正确的XML。

但是,如果您正在检查XML是否有效且格式正确,那么您需要编写DTD或最好是架构文档,以检查允许使用性别属性的位置