Can relaxng specify an unordered set of elements with the same name, but different attributes?

后端 未结 2 1970
粉色の甜心
粉色の甜心 2021-01-13 09:08

Im working to automate the testing of an API which takes and returns XML, so I want to translate the documented return data of the API into schema as much as possible. I cho

相关标签:
2条回答
  • 2021-01-13 09:36

    See if the following schema helps

    <grammar xmlns="http://relaxng.org/ns/structure/1.0">
    <start>
        <element name="item">
            <interleave>
                <element name="id"><text/>
                </element>
                <element name="name"><text/></element>
                <oneOrMore>
                    <ref name="link"/>
                </oneOrMore>
            </interleave>
        </element>
    </start>
    
    <define name="link">
        <element name="link">
            <attribute name="href"/>
            <choice>
                <group>
                    <attribute name="rel"><value>self</value></attribute>
                    <attribute name="type"><value>type1</value></attribute>
                </group>
                <group>
                    <attribute name="rel"><value>download</value></attribute>
                    <attribute name="type"><value>type2</value></attribute>
                </group>
                <group>
                    <attribute name="rel"><value>relatedData</value></attribute>
                    <attribute name="type"><value>type3</value></attribute>
                </group>
            </choice>
        </element>
    </define>
    </grammar>
    
    0 讨论(0)
  • 2021-01-13 09:53

    It looks like you have stumbled upon a restriction on interleave in RELAX NG. I would try to do this in Schematron, or perhaps a combination of RELAX NG and Schematron.

    Here is a snippet that checks your <link> elements using the version of Schematron that is supported by Jing:

    <schema xmlns="http://www.ascc.net/xml/schematron">
      <pattern name="link pattern">
        <rule context="item">
          <assert test='count(link) = 3'>There must be 3 link elements.</assert>
          <assert test="count(link[@rel = 'self' and @type ='type1']) = 1">There must be 1 link element wwhere @rel='self' and @type='type1'.</assert>
          <assert test="count(link[@rel = 'download' and @type ='type2']) = 1">There must be 1 link element where @rel='download' and @type='type2'.</assert>
          <assert test="count(link[@rel = 'relatedData' and @type = 'type3']) = 1">There must be 1 link element where @rel='relatedData' and @type='type3'.</assert>
        </rule>
      </pattern>
    </schema>
    
    0 讨论(0)
提交回复
热议问题