xsd元素必需的可选属性

时间:2013-11-18 08:48:34

标签: xml xsd

元素标题有一个可选的属性languageCode。 我该怎么办? 如果使用该属性,则需要具有languageCode'en'的元素。 例如......

以下是错误的,因为没有en语言代码的元素:

<tns:Lessons>
     <tns:Title language="fr">TitleFR</tns:Title>
     <tns:Title language="de">TitleDE</tns:Title>
</tns:Lessons>

以下是正确的,因为languageCode是可选的:

<tns:Lessons>
     <tns:Title>Title1</tns:Title>
</tns:Lessons>

以下是正确的,因为languageCode en存在:

<tns:Lessons>
     <tns:Title language="en">TitleEN</tns:Title>
     <tns:Title language="de">TitleDE</tns:Title>
</tns:Lessons>

到目前为止我所管理的是这个xsd。

<xsd:element name="Lessons">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element minOccurs="1" maxOccurs="unbounded" ref="tns:Title" />
            </xsd:sequence>
        </xsd:complexType>
        <xsd:unique name="UniqueTitle">
            <xsd:selector xpath="tns:Title"/>
            <xsd:field xpath="@language"/>
        </xsd:unique>               
</xsd:element>  
<xsd:complexType name="i18nNonEmptyString">
    <xsd:simpleContent>
        <xsd:extension base="tns:NonEmptyString">
        <xsd:attribute name="language" type="tns:LanguageCode"  use="required" default="en" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>     
<xsd:element name="Title" type="tns:i18nNonEmptyString"/>
<xsd:simpleType name="LanguageCode">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="en"/>
        <xsd:enumeration value="de"/>
        <xsd:enumeration value="fr"/>
    </xsd:restriction>
</xsd:simpleType>

1 个答案:

答案 0 :(得分:1)

如果您可以使用XML Schema 1.1,那么它应该像将<xsd:assert test="fn:count(./Title[@language='en']) eq 1"/>添加到Lessons元素一样简单。有关详细信息,请参阅http://www.w3.org/TR/xmlschema11-1/#cAssertions。有关简介和一些示例,请参阅https://blogs.oracle.com/rammenon/entry/xml_schema_11_what_you_need_to

如果你坚持使用XML Schema 1.0,那么(我认为)除非你为en和non-en标题引入不同命名的元素,否则它不能完成。 (因为课程模型必须明确“标题”不能同时引用限制和非限制类型的标题。)请参阅Validating the child's age against the parents age in xsd进行类似的讨论。

传统上,Schematron已经与XML Schema 1.0一起用于建模超出XML Schema 1.0的断言。见Wikipedia。 Schematron以其最简单的形式实现为XSLT样式表,该样式表根据规范生成样式表,该样式表根据该规范检查XML文档。对于紧凑的介绍,请参阅http://www.ldodds.com/papers/schematron_xsltuk.html#c35e2592b5b4。有关链接集,请参阅Resource Directory (RDDL) for Schematron 1.5

如果您只做很少的检查并选择使用XSLT进行检查,那么您可能需要手动编写XSLT以避免学习Schematron。