Xml Schema中XML元素的依赖命名

时间:2016-12-02 10:27:07

标签: xml xsd xsd-validation xml-validation xsd-1.1

假设我有这个XML:

<parameters>
  <parameter type="string" isVisible="True" optional="False" id="DealerCode">
     <DealerCode>ABCDEF001</DealerCode>
  </parameter>
</parameters>

我使用了一个Xml-Schema生成器来生成一个基本生成器。结果如下:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xs:element name="DealerCode" type="xs:string"/>
  <xs:element name="parameter">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="DealerCode"/>
      </xs:sequence>
      <xs:attribute type="xs:string" name="type"/>
      <xs:attribute type="xs:string" name="isVisible"/>
      <xs:attribute type="xs:string" name="optional"/>
      <xs:attribute type="xs:string" name="id"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="parameters">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="parameter"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

DealerCode 元素的命名取决于参数元素的标识符。例如,如果参数具有标识符 ZIP,则参数的子元素也应该以这种方式命名。我怎样才能在Xml-Schema中实现这个目标?

示例:

<parameter type="string" isVisible="True" optional="False" id="DealerCode">
    <DealerCode>ABCDEF001</DealerCode>
</parameter>

<parameter type="string" isVisible="True" optional="False" id="ZIP">
    <ZIP>ABCDEF001</ZIP>
</parameter>

1 个答案:

答案 0 :(得分:3)

XSD 1.0

不可能。选项:

  1. 使用xs:any并检查带外XSD。
  2. 通过将通用parameter替换为它包含的特定元素来重新设计XML:

    <DealerCode type="string" isVisible="True"
                optional="False">ABCDEF001</DealerCode>
    
  3. XSD 1.1

    可以使用xs:assert

          <xs:assert test="*/local-name() = @id"/>
    

    这是完整XSD的上下文,它将成功验证您的XML:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified"
               elementFormDefault="qualified"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
               vc:minVersion="1.1">
    
      <xs:element name="DealerCode" type="xs:string"/>
      <xs:element name="parameter">
        <xs:complexType>
          <xs:sequence>
            <xs:any/>
          </xs:sequence>
          <xs:attribute type="xs:string" name="type"/>
          <xs:attribute type="xs:string" name="isVisible"/>
          <xs:attribute type="xs:string" name="optional"/>
          <xs:attribute type="xs:string" name="id"/>
          <xs:assert test="*/local-name() = @id"/>
        </xs:complexType>
      </xs:element>
    
      <xs:element name="parameters">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="parameter" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
    </xs:schema>