XSD 模式节点关系

发布于 2024-12-17 20:22:12 字数 1067 浏览 0 评论 0原文

我正在创建一个 XML 模式,在其中我想通过其父节点的类型或值来限制节点值。问题是,我不知道架构创作时的限制,因为架构必须对多个此类应用程序有效。因此,我想将值类型保留在外部文档中(可能会在编辑文档之前自动创建)。

我的主要目的是使用精通 XML 的工具(最好是 Eclipse)轻松编辑 XML 文件,并自动完成允许的值。

这是一个虚构的例子。假设我想创建一组来自同一漫画/卡通的角色。

<team ref="marvel-heros">
    <member ref="spiderman" />
    <member ref="hulk" />
    <member ref="batman" /><!-- illegal, not in marvel-heros -->
</team>
<team ref="pacman-ghosts">
    <member ref="blinky" />
    <member ref="inky" />
    <member ref="pinky" />
    <member ref="clyde" />
    <member ref="qbert" /><!-- illegal, not in pacman-ghosts -->
</team>

其他可能的标记当然可以

<marvel-heroes>
    <spiderman />
    <hulk />
</marvel-heroes>
<pacman-ghosts>
    <inky />
    <pinky />
</pacman-ghosts>

更改标记,也可以使用命名空间(尽管我不想为每个卡通/漫画使用一个命名空间,因为有很多)。

请注意,漫威团队和吃豆人幽灵可以在同一文档中多次出现。

有什么明智的方法可以做到这一点吗?我是否必须为这些值创建外部架构?或者有没有办法使用实体或 xml 包含来解决这个问题?

I am creating an XML schema in which I would like to restrict node values by the types or values of their parent nodes. The thing is, I don't know the restrictions at the time of schema authoring, because the schema must be valid for more than one such application. So I would like to keep the value types in an external document (that will probably be created automatically before the document is edited).

My main purpose is to make editing the XML files easy with XML-savvy tools (preferably Eclipse), with auto-completion of allowed values.

Here's a fictional example. Let's say I want to create a group of characters from the same comic / cartoon.

<team ref="marvel-heros">
    <member ref="spiderman" />
    <member ref="hulk" />
    <member ref="batman" /><!-- illegal, not in marvel-heros -->
</team>
<team ref="pacman-ghosts">
    <member ref="blinky" />
    <member ref="inky" />
    <member ref="pinky" />
    <member ref="clyde" />
    <member ref="qbert" /><!-- illegal, not in pacman-ghosts -->
</team>

Other possible markups would be

<marvel-heroes>
    <spiderman />
    <hulk />
</marvel-heroes>
<pacman-ghosts>
    <inky />
    <pinky />
</pacman-ghosts>

Of course the markup can be changed, and namespaces could be used as well (although I'd rather not use one namespace per cartoon / comic as there are many).

Note that the marvel team and the pacman ghosts can appear multiple times in the same document.

Is there a sensible way I can do this? Do I have to create an external schema for the values? Or is there a way to solve this using entities or xml includes?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瑕疵 2024-12-24 20:22:12

如果您使用 XML 架构,则最好使用第二种标记 (...)。只有 RelaxNG 允许在给定特定属性值的情况下使用这种验证机制。
对于您对外部文档的担忧,也许您可​​以考虑 XML Schema 中的包含机制:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="type.xsd"/>
    <xs:element name="marvel-team" type="marvel-teamType"/>
    <xs:element name="pacman-ghosts" type="pacman-ghostsType"/>
</xs:schema>

对于 type.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="marvel-teamType">
        <xs:sequence>
            <xs:element name="spiderman" />
            <xs:element name="hulk" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="pacman-ghostsType">
        <xs:sequence>
            <xs:element name="inky" />
            <xs:element name="pinky" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

添加时只有 type.xsd 需要更改或删除元素。

If you use XML Schema, you better use the second kind of markup (<marvel-team>...). Only RelaxNG allows such validation mechanism given specific attribute values.
For your concern about external documents, maybe be you can consider the include mechanism in XML Schema :

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="type.xsd"/>
    <xs:element name="marvel-team" type="marvel-teamType"/>
    <xs:element name="pacman-ghosts" type="pacman-ghostsType"/>
</xs:schema>

And for the type.xsd :

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="marvel-teamType">
        <xs:sequence>
            <xs:element name="spiderman" />
            <xs:element name="hulk" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="pacman-ghostsType">
        <xs:sequence>
            <xs:element name="inky" />
            <xs:element name="pinky" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Only type.xsd has to change when you add or remove elements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文