XML Schema:仅包含“受限”文本的属性元素

3
我想定义一个带有受限文本和属性的元素。
<some_element my_attr="data">some restricted text</some_element>

How can I create an element like this?

I tried:

<complexType>
    <simpleContent>
        <restriction base="string">
            <pattern value="AAA"></pattern>
            <attribute name="newattr" type="string"></attribute>
        </restriction>
    </simpleContent>
</complexType>

但是却收到错误消息:

对于类型“#AnonType_childparent”的复杂类型定义表示错误。当使用<restriction>时,基础类型必须是内容类型为简单的复杂类型,或仅在指定限制时,是具有混合内容和可为空粒子的复杂类型,或仅在指定扩展时,是简单类型。'string'不满足这些条件中的任何一个。

然后尝试了类似以下的内容

<complexType>
    <complexContent>
        <extension base="string">
            <attribute name="attr" type="string"></attribute>
        </extension>
    </complexContent>
</complexType>

这次出现的错误是(这次我没有添加任何限制;这只是为了测试):
对于类型“#AnonType_childparent”的复杂类型定义表示错误。当使用时,基本类型必须是复杂类型。“string”是一个简单类型。
我不太清楚这些错误到底意味着什么?是否有更好的错误文本解释可用?
1个回答

5

你的问题或多或少是这个问题的重复(只是 回答 了它)。

从以下几点考虑:

  • 如果您的元素具有属性和/或嵌套元素,则它必须是一个复杂类型。
  • 如果您的元素可以包含文本,但没有标记(嵌套元素),则它必须是simpleContent的类型。
  • simpleContent只能从简单类型扩展(如果需要添加属性)。 如果您需要在简单类型上添加其他约束,则需要专门创建新的简单类型,限制基本类型,然后在简单内容中扩展该类型。

这篇文章 在SO上展示了上面解释的端到端示例。 对于您的特定情况:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:simpleType name="tSomeRestrictedText">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="AAA"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:element name="some_element">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="tSomeRestrictedText">
                    <xsd:attribute name="my_attr" type="xsd:string"/>
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

我面临的问题是,我知道如何为元素添加带属性的文本内容,但我无法为受限制的内容执行此操作。 - Master Chief
@MasterChief,不太确定我是否理解了您的意思;请查看更新后的回复;对您是否有效,请澄清一下。 - Petru Gardea
我已将此标记为答案,因为它完成了工作。但是您能否澄清一下,为什么我们需要分成两部分。为什么不能直接扩展受限类型(使用嵌套)? - Master Chief
@MasterChief,你的目标是添加一个属性(你正在从头创建一个新的复杂类型/简单内容)。要添加属性,你需要进行扩展。simpleContent下的扩展粒子仅支持添加属性,没有其他功能。限制粒子,例如你可能感兴趣的约束,只是限制粒子的一部分。 - Petru Gardea
非常感谢您的澄清。 - Master Chief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接