【问题标题】:Validating against XSD with global attributes and namespaces使用全局属性和命名空间验证 XSD
【发布时间】:2021-05-02 12:40:09
【问题描述】:

我试图在 XSD 文件(XML Schema)中引用一些属性,并得到以下错误:

属性“code”不允许出现在元素“project”中。

属性“type”不允许出现在元素“duration”中。

属性“type”不允许出现在元素“duration”中。

谁能向我解释我做错了什么?

这是我的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<timesheets xmlns="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets timesheets.xsd">
        <employee id="234456" ismanager="false" hiredate="2003-01-12">
            <firstname>Julie</firstname>
            <surname>Smith</surname>
        </employee>
        <projects>
            <project code="TSK2367">
                <task>
                    <description>Create project plan for MIJ website</description>
                    <duration type="days">
                        <planned>2</planned>
                        <actual>1</actual>
                    </duration>
                </task>
                <task>
                    <description>Draft the conceptual web site navigation for MIJ</description>
                    <duration type="hours">
                        <planned>3</planned>
                        <actual>2</actual>
                    </duration>
                </task>
            </project>
        </projects>
    </timesheets>

这是我的 XSD 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified"
        targetNamespace="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
        xmlns="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
        >

        <xs:attributeGroup name="employeeAttrs">
            <xs:attribute name="id" type="xs:int" />
            <xs:attribute name="ismanager" type="xs:boolean" />
            <xs:attribute name="hiredate" type="xs:date" />
        </xs:attributeGroup>
        <xs:element name="firstname" type="xs:string" />
        <xs:element name="surname" type="xs:string" />
        <xs:attribute name="code" type="xs:string" />
        <xs:element name="description" type="xs:string" />
        <xs:attribute name="type" type="xs:string" />
        <xs:element name="planned" type="xs:int" />
        <xs:element name="actual" type="xs:int" />



        <xs:element name="timesheets">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="employee">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element ref="firstname" />
                                <xs:element ref="surname" />
                            </xs:sequence>
                            <xs:attributeGroup ref="employeeAttrs" />
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="projects">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="project" maxOccurs="unbounded">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="task" maxOccurs="unbounded">
                                                <xs:complexType>
                                                    <xs:sequence>
                                                        <xs:element ref="description" />
                                                        <xs:element name="duration">
                                                            <xs:complexType>
                                                                <xs:sequence>
                                                                    <xs:element ref="planned" />
                                                                    <xs:element ref="actual" />
                                                                </xs:sequence>
                                                                <xs:attribute ref="type" />
                                                            </xs:complexType>
                                                        </xs:element>
                                                    </xs:sequence>
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:sequence>
                                        <xs:attribute ref="code" />
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

【问题讨论】:

  • 我使用 XmlPad 验证您拥有的内容,没有发现任何错误。你在用什么?
  • 嗨,史蒂夫,我正在使用 Oxygen XML 作者。

标签: xml xsd xml-validation


【解决方案1】:

如果您希望更改 XML 以符合 XSD,请为 xmlns:ts="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets" 定义命名空间前缀并将其用于未找到的属性:

<?xml version="1.0" encoding="UTF-8"?>
<timesheets xmlns="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
            xmlns:ts="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets
                                timesheets.xsd">
  <employee id="234456" ismanager="false" hiredate="2003-01-12">
    <firstname>Julie</firstname>
    <surname>Smith</surname>
  </employee>
  <projects>
    <project ts:code="TSK2367">
      <task>
        <description>Create project plan for MIJ website</description>
        <duration ts:type="days">
          <planned>2</planned>
          <actual>1</actual>
        </duration>
      </task>
      <task>
        <description>Draft the conceptual web site navigation for MIJ</description>
        <duration ts:type="hours">
          <planned>3</planned>
          <actual>2</actual>
        </duration>
      </task>
    </project>
  </projects>
</timesheets>

如果您希望更改 XSD 以使 XML 有效,请将 codetype 的定义本地移动到使用它们的位置而不是全局:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           targetNamespace="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
           xmlns:ts="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
           xmlns="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
           >

  <xs:attributeGroup name="employeeAttrs">
    <xs:attribute name="id" type="xs:int" />
    <xs:attribute name="ismanager" type="xs:boolean" />
    <xs:attribute name="hiredate" type="xs:date" />
  </xs:attributeGroup>

  <xs:element name="firstname" type="xs:string" />
  <xs:element name="surname" type="xs:string" />
  <xs:element name="description" type="xs:string" />
  <xs:element name="planned" type="xs:int" />
  <xs:element name="actual" type="xs:int" />

  <xs:element name="timesheets">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="employee">
          <xs:complexType>
            <xs:sequence>
              <xs:element ref="firstname" />
              <xs:element ref="surname" />
            </xs:sequence>
            <xs:attributeGroup ref="employeeAttrs" />
          </xs:complexType>
        </xs:element>
        <xs:element name="projects">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="project" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="task" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element ref="description" />
                          <xs:element name="duration">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element ref="planned" />
                                <xs:element ref="actual" />
                              </xs:sequence>
                              <xs:attribute name="type" type="xs:string" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="code" type="xs:string" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

更新 cmets 中的每个 OP 问题:

所以你是说没有办法引用属性 没有将其定义放在全局范围内?

不,我展示了如果您想通过更改 XSD 来消除错误,您可以将 codetype 属性的声明设为本地而不是全局。

还有,为什么引用的attributeGroup没有报错?

因为属性声明对于属性组来说是本地的。

关于属性和命名空间的建议

使用属性的最常见方式,我建议您遵循的方式,除非您定义一个基于属性的词汇表,故意与多个命名空间,是让它们不在命名空间中。

您的属性选择不在命名空间中:

  1. 没有targetNamespace
  2. 在本地向元素或属性组声明属性。

【讨论】:

  • 感谢您的回答。那么您是说如果不将其定义放在全局范围内就无法引用属性?还有,为什么引用的attributeGroup没有报错?
  • 答案已更新以解决后续问题。
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多