簡體   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