XSD:Child的名称是parent的属性的名称

时间:2013-11-29 12:24:18

标签: xml xsd xsd-validation

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

<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”是我难倒的地方。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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>

答案 1 :(得分:0)

当您违反XML中的“不要重复自己”规则时,这是否可以解决可能出现的问题?