元素标题有一个可选的属性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>
答案 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。