【问题标题】:Optional keyref in xsd?xsd中的可选keyref?
【发布时间】:2021-07-06 00:44:03
【问题描述】:

是否可以在 xsd 中定义一个属性,使其可以有一个空值,但在有值时检查是否引用另一个元素?

<?xml version="1.0" encoding="UTF-8"?>
<TableStructure xmlns="tmp/TableStructure"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="tmp/TableStructure TableStructure.xsd">
  <Column name="a" />
  <Column name="b" />
  <Column name="c" />
  <Range name="r1" fromColumn="a" toColumn="b" /> <!-- works -->
  <Range name="r2" fromColumn="a" toColumn="" /> <!-- should work -->
  <Range name="r3" fromColumn="a" /> <!-- works -->
  <Range name="r4" fromColumn="" toColumn="c" /> <!-- should work -->
  <Range name="r5" fromColumn="foo" toColumn="bar" /> <!-- should not and does not work -->
</TableStructure>

我尝试了以下架构:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="tmp/TableStructure" elementFormDefault="qualified"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns="tmp/TableStructure"
            xmlns:ts="tmp/TableStructure">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace"
                schemaLocation='http://www.w3.org/2009/01/xml.xsd' />

    <xsd:element name="TableStructure">
        <xsd:complexType>
            <xsd:sequence minOccurs="1" maxOccurs="1">
                <xsd:element ref="Column" maxOccurs="unbounded" minOccurs="0" />
                <xsd:element ref="Range" maxOccurs="unbounded" minOccurs="0" />
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="columnName-key">
            <xsd:selector xpath="./ts:Column" />
            <xsd:field xpath="@name" />
        </xsd:key>
        <xsd:keyref name="fromColumn-ref" refer="columnName-key">
            <xsd:selector xpath="./ts:Range" />
            <xsd:field xpath="@fromColumn" />
        </xsd:keyref>
        <xsd:keyref name="toColumn-ref" refer="columnName-key">
            <xsd:selector xpath="./ts:Range" />
            <xsd:field xpath="@toColumn" />
        </xsd:keyref>
    </xsd:element>

    <xsd:element name="Column">
        <xsd:complexType>
            <xsd:attribute name="name" type="xsd:string" use="required" />
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="Range">
        <xsd:complexType>
            <xsd:attribute name="name" type="xsd:string" use="required" />
            <xsd:attribute name="fromColumn" use="optional" type="xsd:string" />
            <xsd:attribute name="toColumn" use="optional" type="xsd:string" />
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

我可以使用选择器/字段以某种方式排除空属性吗?

我正在尝试为现有文件创建架构,并且不想更改它们以删除空属性。

【问题讨论】:

    标签: xml xsd keyref


    【解决方案1】:

    不,keyref 功能不允许您将零长度字符串的属性与其他属性区别对待。

    XSD 往往有点家长式,因为它只允许您描述 XSD 设计者认为是良好实践的设计,我想 XSD 的设计者会告诉您应该在这里省略属性而不是让它呈现一个空值。

    【讨论】:

    • 感谢您澄清这一点。这并不理想,但我可以解决这个问题,并且不会浪费更多时间来寻找解决方法。
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2013-04-06
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多