如何在xsd中引用属性

2024-01-03

我尝试定义一个可以在后续元素定义中引用的属性。

<xs:attribute name="ridref" type="xs:string"/>

后来我这样使用它:

<xs:element name="coordRegRef">
  <xs:complexType>
    <!--xs:attribute name="ridref" type="xs:string"/ this works but I want to use ref -->
    <xs:attribute ref="ridref" use="required"/>
  </xs:complexType>
</xs:element>

XSD 使用 xmllint 可以正常编译

xmllint --schema pc-ar.xsd pc-ar.xml

但 xmllint 说

pc-ar.xml:41: element coordRegRef: Schemas validity error : Element '{http://pc-ar.xsd}coordRegRef', attribute 'ridref': The attribute 'ridref' is not allowed.
pc-ar.xml:41: element coordRegRef: Schemas validity error : Element '{http://pc-ar.xsd}coordRegRef': The attribute '{http://pc-ar.xsd}ridref' is required but missing.

我将其解释为我的 XML 文件必须使用ridref 的命名空间

<coordRegRef fix:ridref="111"/>

(这确实有效,但不受欢迎)而不是

<coordRegRef ridref="111"/>

Why?

My XSD

<?xml version="1.0"?>
<!-- validate: xmllint - -schema pc-ar.xsd pc-ar.xml -->
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://pc-ar.xsd"
    elementFormDefault="qualified"
    xmlns="http://pc-ar.xsd"
    xmlns:fix="http://pc-ar.xsd">

    <!--xs:attribute name="rid" type="xs:integer"/-->

    <!--xs:attributeGroup name="ridGroup">
    <xs:attribute name="rid" type="xs:integer"> 
        <xs:annotation>
            <xs:documentation>entry id</xs:documentation>
        </xs:annotation>
    </xs:attribute>
</xs:attributeGroup-->

    <xs:element name="name" type="xs:string"/>
    <xs:attribute name="id" type="xs:ID"/>
    <xs:attribute name="idref" type="xs:IDREF"/>

    <xs:attribute name="ridref" type="xs:string"/>

    <xs:element name="coordRegRef">
        <xs:complexType>
            <!--xs:attribute name="ridref" type="xs:string"/works-->
            <xs:attribute ref="ridref" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="assetRegRef">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ridref2" type="xs:string"/>
            </xs:sequence>
            <!--xs:attribute name="ridref" type="xs:string"/works-->
            <xs:attribute name="ridref" type="xs:string"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="lat">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="-40"/>
                <xs:maxInclusive value="-30"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

    <xs:element name="lon" type="xs:decimal"/>

    <xs:complexType name="coordRegTableType">
        <xs:sequence>
            <xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="name"/>
                        <xs:element ref="lat"/>
                        <xs:element ref="lon"/>
                    </xs:sequence>
                    <xs:attribute name="rid" type="xs:string"/>
                    <!--xs:attribute ref="fix:id" use="required"/-->
                    <xs:attribute name="id" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="assetRegTableType">
        <xs:sequence>
            <xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="name"/>
                        <xs:element ref="coordRegRef"/>
                        <xs:element ref="assetRegRef"/>
                    </xs:sequence>
                    <xs:attribute name="rid" type="xs:string"/>
                    <xs:attribute name="id" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="coordReg" type="fix:coordRegTableType">
        <xs:unique name="coordRegNameUniq">
            <xs:selector xpath="*"/>
            <xs:field xpath="fix:name"/>
        </xs:unique>
    </xs:element>

    <xs:element name="assetReg" type="assetRegTableType">
        <xs:unique name="assetRegNameUniq">
            <xs:selector xpath="fix:entry"/>
            <xs:field xpath="fix:name"/>
        </xs:unique>
    </xs:element>

    <xs:element name="assetExchange">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="coordReg"/>
                <xs:element ref="assetReg"/>
            </xs:sequence>
            <xs:attribute name="rid" type="xs:integer"/>
            <!--xs:attribute ref="id" use="required"/-->
        </xs:complexType>

        <xs:key name="coordRegKey">
            <xs:selector xpath="fix:coordReg/fix:entry"/>
            <xs:field xpath="@rid"/>
        </xs:key>

        <xs:key name="assetRegKey">
            <xs:selector xpath="fix:assetReg/fix:entry"/>
            <xs:field xpath="@rid"/>
        </xs:key>

        <xs:keyref name="assetRegKeyRef" refer="assetRegKey">
            <xs:selector xpath=".//fix:assetRegRef"/>
            <xs:field xpath="@ridref"/>
        </xs:keyref>

        <xs:keyref name="assetRegKeyRef2" refer="assetRegKey">
            <!--xs:selector xpath=".//fix:assetRegRef"/works-->
            <!--xs:selector xpath="./*/*/fix:assetRegRef"/works-->
            <!--xs:selector xpath="./*/fix:entry/fix:assetRegRef"/works-->
            <!--xs:selector xpath="./*/*/fix:assetRegRef"/works-->
            <xs:selector xpath=".//fix:assetRegRef"/> <!-- any assetRefRef -->
            <xs:field xpath="fix:ridref2"/>
        </xs:keyref>

        <xs:keyref name="coordRegKeyRef" refer="coordRegKey">
            <xs:selector xpath=".//fix:coordRegRef"/>
            <xs:field xpath="@ridref"/>
        </xs:keyref>

    </xs:element>

</xs:schema> 

我的 XML 测试文件

<?xml version="1.0"?>

<assetExchange 
  xmlns="http://pc-ar.xsd"
  xmlns:fix="http://pc-ar.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://pc-ar.xsd pc-ar.xsd"
  rid="1">

<coordReg>
  <entry id="1" rid="111">
    <name>sitea</name>
    <lat>-31.23</lat>
    <lon>151</lon>
  </entry>

  <entry id="2" rid="222">
    <name>siteb</name>
    <lat>-31.23</lat>
    <lon>151</lon>
  </entry>

  <entry id="3" rid="333">
    <name>sitec</name>
    <lat>-31.23</lat>
    <lon>151</lon>
  </entry>
</coordReg>

<assetReg>
  <entry id="11" rid="11">
    <name>deva</name>
    <coordRegRef fix:ridref="111"/>
    <assetRegRef ridref="aa"><ridref2>aa</ridref2></assetRegRef>
  </entry>

  <entry id="22" rid="22">
    <name>devb</name>
    <coordRegRef ridref="2212"/>
    <assetRegRef ridref="11"><ridref2>11</ridref2></assetRegRef>
  </entry>

  <entry id="33" rid="33">
    <name>devc</name>
    <coordRegRef ridref="333"/>
    <assetRegRef ridref="44"><ridref2>44</ridref2></assetRegRef>
  </entry>

</assetReg>

</assetExchange>

正如您所注意到的,并且从验证错误中可以看出,解析器确实期望该属性ridref但它必须在命名空间中。

原因是在 XML 模式中,所有全局元素、属性或类型定义都必须经过限定。这会导致所有全局定义的属性都将以命名空间为前缀,即使您已设置attributeFormDefault="unqualified"。解决方法是在内部单独定义此类属性<xs:attributeGroup>(或在全局类型中)。在这种情况下,属性组的名称将获取附加到它的命名空间,而不是其中属性的名称。然后你可以使用ref引用这些属性组并获取全局可用的属性,而无需将它们放在命名空间中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在xsd中引用属性 的相关文章

随机推荐

  • Unity C# ArgumentOutOfRangeException:参数超出范围。参数名称:索引[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在创建一个像蛇一样的游戏 在我下面的代码中 蛇身体的每个部分都是 Character 类的一个实例 当我尝试添加新角色时 出现错误
  • python中数组的就地修改

    我发现这个问题要求对数组进行就地修改 以便将所有零移动到数组末尾 并保持非零元素的剩余顺序 根据问题陈述 就地意味着不复制原始数组 这取自 Leetcode 可以在 283 Move Zeroes 中找到 输入和输出的示例是 0 1 0 1
  • 如何在 Github Gist 中软换行

    我有一个很长的字符串 我想使用 Github Gist 将其嵌入到我的博客中 我想为其启用换行 以便读者不必向右滚动即可查看整个字符串 即使在编辑时单击 软换行 选项 最终的要点也不会换行 编辑时 启用软包装 保存后 无换行 How can
  • PHP 将任何尺寸的图像调整为 16:9 的宽高比

    午安 我目前正在尝试了解如何以 16 9 的宽高比裁剪服务器上已加载的图像 为了更好地理解 如果我有 4 3 图像 我必须剪切顶部和底部图像部分以使其适合 16 9 比例 Thanks 我举了这个代码示例 http myrusakov ru
  • Javascript 中类似 Python 的“类”

    我想知道如何在 Javascript 中创建类似于 Python 中的 类 采用此处列出的 Python 类和函数 class one def foo bar some code 函数 foo 将被调用one foo bar JS 的等价物
  • 在纯原生 Android 应用程序中渲染文本

    我有一个纯原生的 Android NDK 应用程序 需要在每一帧渲染一些文本 我读过一些帖子 说我需要使用字体的所有字符创建一个图像文件 然后将每个字符渲染为该图像的四边形 这听起来需要大量工作 而且我不知道从哪里获取简单字体 例如 Ari
  • 将lucene索引分成两半

    将现有 Lucene 索引拆分为两半的最佳方法是什么 即每个拆分应包含原始索引中文档总数的一半 拆分现有索引 无需重新索引所有文档 的最简单方法是 制作现有索引的另一个副本 即 cp r myindex mycopy 打开第一个索引 并删除
  • 元组索引超出范围,Tensorflow

    这是模型 它是基本的张量流模型 可以拍摄数字的图片并告诉您它是什么数字 我知道python中的索引从0开始 我遇到的问题是这行代码 model fit np array test np array num 阅读下面的代码以获取更多信息 im
  • MATLAB调用DLL中函数时的堆栈限制是多少

    我试图弄清楚 当 MATLAB 调用 DLL 中的函数时 堆栈大小限制是多少 有没有办法配置限制 我在用loadlibrary and calllib函数来调用 C 实现的函数 在动态链接库中 我创建了一个测试来找出堆栈限制 我使用 MAT
  • MediaRecorder 无效状态 16

    我正在尝试录制音频并保存到 SD 卡 我收到无效状态异常 我添加了正确的权限 例如 record audio 和 write external storage 我在调用 start 之前已经准备好了 MediaRecorder 为什么我会遇
  • 在后台扫描 Android 8+ 上的 BLE 设备

    我在 Android 8 上使用 BLE 扫描仪 API 中的以下方法 扫描 BLE 信标 startScan List
  • 将 C++ 对象(尤其是 stl 容器)移动到特定的内存位置

    我正在与一个内存管理器合作 有时需要对内存进行碎片整理 基本上 我将浏览内存管理器分配的对象列表并重新定位它们 class A SomeClass data This member is allocated by the special m
  • “索引、关注”或“关注”有什么区别?

    下面的列表有什么区别 首先 你可能知道元机器人 标签 元机器人标签是告诉蜘蛛或爬虫要抓取或索引哪个页面 关注手段 页面将被抓取 没有关注意味着 页面不会被抓取 指数均值 您的页面显示在搜索结果中 无索引意味着 您的页面未显示在
  • Rails 3 SQL 查询选择与连接

    我的选择功能和连接有问题 这是我当前的查询 search Building joins INNER JOIN floors ON floors building id buildings id INNER JOIN spaces ON sp
  • 是否支持内存映射文件作为 uwp 应用程序和 win32 进程之间的 ipc

    官方文档没有正确说明 uwp 是否支持通过内存映射文件的 ipc 我正在研究 uwp 应用程序及其桌面扩展之间的 ipc 场景 虽然我可以使用创建内存映射文件System IO MemoryMappedFiles从 uwp 应用程序code
  • 在打字稿中导出实用函数?

    我正在尝试这样做 伪代码 export const isDefined Function
  • Spring Security 3.1.3 @EnableWebSecurity

    我无法找到 Spring Security 3 1 3 中哪个包包含 EnableWebSecurity 我已经添加了 core config web 和 ldap 安全包 但注释仍然不可用 是否已被其他注释替换 我认为 Spring Se
  • 使用 Blazor 单击提交后清除输入字段

    我想知道是否有人知道如何在按下保存按钮 已提交 后清除所有输入字段 当我返回页面时 我的价值观仍然存在 这是我正在使用的代码 page testform inject BlazorApp6 Data Person person inject
  • 解组单个元素列表失败

    我正在运行一个示例 我再也找不到了 布莱斯 道恩斯博客 http blog bdoughan com在 Glassfish 3 上使用 EclipseLink 2 5 MOXy for JAXB 服务 XmlRootElement XmlA
  • 如何在xsd中引用属性

    我尝试定义一个可以在后续元素定义中引用的属性