繁体   English   中英

XSD:孩子的名字是父母的名字

[英]XSD: Child's name is the name of parent's attribute

是否可以验证以下XML,其中父级的子级名称是其属性“名称”:

<root>
  <parent name="foo">
    <foo/>
  </parent>
  <parent name="bar">
    <bar/>
  </parent>
  <parent name="abc">
    <xyz/> <!-- invalid -->
  </parent>
</root>

XSD,根据要求:

<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:complexType name="parentType">
    <xsd:sequence>
      <!-- TODO: enforce element name same as it's parent's attribute "name" -->
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <xsd:element name="root">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="parent" type="parentType"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

“ TODO”是我的绊脚石。 在此先感谢您的帮助!

XSD 1.0中 ,您不能直接指定这样的约束,但是可以使用Schematron指定它或在应用程序级别检查它。

XSD 1.1中 ,您可以使用xsd:assert

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema elementFormDefault="qualified"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:complexType name="parentType">
    <xsd:sequence>
      <xsd:any processContents="lax" minOccurs="1" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:assert test="@name = local-name(*[1])"/>
  </xsd:complexType>

  <xsd:element name="root">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="parent" type="parentType" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

这是在查看违反XML规则“不要重复自己”时会出问题的练习吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM