标签: keyref

XSD键/ keyref初学者问题

我正在尝试实现一个非常简单的XML模式约束.

只应允许<batz>类型元素的idref属性具有与至少一个元素<bar>上的id属性匹配的值.

如果这对你没有任何意义,那么请看下面的示例XML文档,我认为它实际上解释了它比我试图用文字更好.

所以,问题:为什么xmllint让下面的schema/xml组合传递(它说文档是有效的)?如何修复它以达到预期的约束?

架构:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="test" xmlns="test" elementFormDefault="qualified">

    <xs:element name="foo">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="bar" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="id" use="required" type="xs:string" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="batz" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="idref" use="required" type="xs:string" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>

        <xs:key name="ID">
            <xs:selector xpath="./bar" />
            <xs:field xpath="@id" />
        </xs:key>

        <xs:keyref name="IDREF" refer="ID">
            <xs:selector xpath="./batz" />
            <xs:field xpath="@idref" />
        </xs:keyref>

    </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

文件:

<?xml version="1.0"?>
<foo xmlns="test">
    <bar id="1" />
    <bar …
Run Code Online (Sandbox Code Playgroud)

xml schema xsd keyref

10
推荐指数
2
解决办法
9421
查看次数

Visual Studio 2010中的XSD key/keyref intellisense验证支持

我一直在寻找答案而找不到答案:

  • 在Visual Studio 2010中是否通过Intellisense提供XSD密钥/ keyref验证支持?
  • 如果是这样,如何使它工作?
  • 如果不是,Visual Studio中是否有(内置)方法在具有XSD架构的XML中进行密钥/引用验证?

谢谢!

更新:请注意,问题不在于如何验证具有XSD文件的XML.我特别询问了关键/ keyref intellisense / Visual Studio中的任何支持,似乎根本没有添加.

xml intellisense xsd visual-studio-2010 keyref

8
推荐指数
1
解决办法
869
查看次数

如何使用key/keyrefs为相同类型的嵌套元素创建xml架构

我定期使用一些XML文件,并希望DTD可以提供更好的验证.所以我开始阅读有关模式的内容,看看是否会帮助我.到目前为止,我已经能够创造出几乎像我需要的东西,除了一件.我希望能够将元素的属性限制为具有相同元素类型的兄弟或祖先元素的不同属性的值.使用XML Schema密钥/ keyref限制是否可以实现这一点?

我有一个看起来像这样的文档:

<nodeContainer>
    <node name="Table">
    </node>

    <node name="MyHouse">
        <node name="RoomWithDoor">
        </node>
        <node name="DiningRoom" extends="RoomWithDoor">
            <node name="DiningTable" extends="Table">
            </node>
        </node>
    </node>

    <node name="MySummerHouse">
        <node name="DiningRoom">
            <node name="DiningTable" extends="Table">
            </node>
        </node>
    </node>
</nodeContainer>
Run Code Online (Sandbox Code Playgroud)

在本文档中,节点可以"扩展"以下其他节点:

  • 兄弟姐妹
  • 父母的兄弟姐妹

但是,节点不应"扩展":

  • 父母
  • 父母兄弟姐妹的子节点

这意味着MyHouse可以"扩展" ,这是没有意义的,但我没关系.

同样重要的是,两个房屋节点都应该能够拥有自己的名为DiningRoom的节点.

我目前的架构与此类似:

<xs:complexType name="node">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="node"/> <!-- node can have other nodes inside it -->
        <xs:element ref="leaf"/>
    </xs:choice>
    <xs:attribute name="name"       type="xs:anySimpleType" use="required"/>
    <xs:attribute name="extends"    type="xs:anySimpleType"/>
</xs:complexType>

<!-- document root -->
<xs:element …
Run Code Online (Sandbox Code Playgroud)

xml schema xsd keyref xsd-validation

6
推荐指数
1
解决办法
1965
查看次数