代码之家  ›  专栏  ›  技术社区  ›  SirKM

如何根据属性值确定XML元素的子元素

  •  1
  • SirKM  · 技术社区  · 7 年前

        <xsd:element name="testEl">
            <xsd:complexType>
                <xsd:choice>
                    <xsd:sequence>
                        <xsd:element name="testElChild">
                            <xsd:complexType>
                                <xsd:sequence>
                                    <xsd:element name="tec1"/>
                                    <xsd:element name="tec2"/>
                                </xsd:sequence>
                                <xsd:attribute name="type" use="required" fixed="yes"/>
                            </xsd:complexType>
                        </xsd:element>
                    </xsd:sequence>
                    <xsd:sequence>
                        <xsd:element name="testElChild">
                            <xsd:complexType>
                                <xsd:sequence>
                                    <xsd:element name="tec3"/>
                                    <xsd:element name="tec4"/>
                                </xsd:sequence>
                                <xsd:attribute name="type" use="required" fixed="no"/>
                            </xsd:complexType>
                        </xsd:element>
                    </xsd:sequence>
                </xsd:choice>
            </xsd:complexType>
        </xsd:element>
    

    基本上,我试图指定如果元素的type属性 testElChild 如果值为“yes”,则它应该包含子元素 tec1 tec2 ,但是如果type属性的值为“no”,那么它应该包含子元素 tec3 tec4 .

    1 回复  |  直到 7 年前
        1
  •  1
  •   cdan    7 年前

    如果你 显示验证错误 你得到了。我只能假设你有相同的元素名 testElChild 在两种选择中。

    为了解决这个问题,我建议您在编写XML模式时遵循两个最佳实践:

    • Avoid anonymous types :如果从命名类型而不是匿名类型开始,则更容易进行故障排除;然后,当一切正常并且仍决定使用匿名类型时,可以使用匿名类型进行翻译(如果只使用一次);
    • Use polymorphism instead of xsd:choice :定义抽象类型 TestElChild NoTypeTestElChild YesTypeTestElChild .

    一开始可能很乏味,但从长远来看会给你带来一些麻烦。如果您在根据这些实践编写XSD时遇到问题,请告诉我们。