【问题标题】:XML schema : 'ref' or 'name' must be present in a local element declarationXML 模式:“ref”或“name”必须出现在本地元素声明中
【发布时间】:2018-07-06 11:35:02
【问题描述】:

我正在创建一个 XML 模式,但我的所有元素都发生了以下错误:

“ref”或“name”之一必须出现在本地元素声明中。

我不明白,因为我的 XSD 文档中有 nameref,您可以在此处看到:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo">
<xsd:import namespace="http://NamespaceTest.com/balisesXrm" schemaLocation="balisesXrm.xsd"/>
<xsd:import namespace="http://www.moss.fr/2011/connecteur_xrm"/>

<xsd:complexType xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" name="typeAssociation">
    <xsd:sequence>
        <xsd:element xmlns:ns0="http://NamespaceTest.com/balisesXrm" ns0:ref="balisesXrmType"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:element name="plugin">
  <xsd:complexType>
     <xsd:sequence>
        <xsd:element xmlns:ns0="http://www.moss.fr/2011/connecteur_xrm" ns0:name="xrm:header" type="header"/>
     </xsd:sequence>
  </xsd:complexType>
</xsd:element>

你可以在这里找到我的 balisesXrm.xsd 文件:

<?xml version="1.0" encoding="UTF-8"?>


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       targetNamespace="http://NamespaceTest.com/balisesXrm"
       xmlns:b="http://NamespaceTest.com/balisesXrm">


<xsd:complexType name="balisesXrm">
    <xsd:choice>
        <xsd:sequence>
            <xsd:element name="attribut" />
            <xsd:element name="variable" />
            <xsd:element name="param" />
            <xsd:element name="java" />
            <xsd:element name="historisation-date" />
        </xsd:sequence>
    </xsd:choice>
</xsd:complexType>

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

    有错误告诉你确切的问题:

    “ref”或“name”之一必须出现在本地元素声明中。

    所以对于

      <xsd:element xmlns:ns0="http://NamespaceTest.com/balisesXrm" 
                   ns0:ref="balisesXrmType"/>
    

    @ns0:ref中删除ns0

      <xsd:element ref="balisesXrmType"/>
    

    现在您将拥有@ref 属性,因为错误表明您丢失了。您尚未提供完整的 MCVE,但这看起来可能已关闭。通常,被引用的元素不会有 Type 后缀,所以也许您的意思是,

      <xsd:element ref="balisesXrm"/>
    

    请注意,要在另一个命名空间中引用 balisesXrm,请在本地或更好的根级别为该命名空间声明一个命名空间前缀 xmlns:ns0="http://NamespaceTest.com/balisesXrm",因为您可能在其他地方需要它,然后在 @ 上使用它987654330@ 属性,而不是名称

      <xsd:element ref="ns0:balisesXrm"/>
    

      <xsd:element name="balisesXrm" type="ns0:balisesXrmType"/>
    

    您的 XSD 有太多其他问题无法在一个问题中解决,但这个答案至少可以让您克服当前的问题。

    【讨论】:

    • 感谢您的回答。实际上,我在本地使用命名空间,因为当我导入我的 balisesXrm.xsd(正如我编辑的那样)时,出现了一个新错误:未声明前缀“b”(我删除了我元素中的命名空间创建并将我所有的 balisesXrm 重命名为b:balisesXrm)。我没有指定的是我使用 XSLT 文档来生成这个模式。
    • 抱歉,我最初为您声明了一个新的命名空间前缀b,然后才意识到您已经为此目的使用了ns0。我已更新答案以使用您原来的ns0。当然,请注意,命名空间前缀仅通过与完整命名空间 URI 的关联来获得其重要性,但我们必须正确绑定 bns0。就是现在。谢谢。
    • XML 命名空间前缀定义的范围仅扩展到声明元素所包含的元素;它不会扩展到导入 XSD。
    • 您的 balisesXrm.xsd 没有 xs:element 声明 balisesXrm;它只有一个类型声明。重新阅读我写的关于元素与类型的内容。在您最近添加的导入 XSD 中,考虑使用 Type 后缀命名您的类型,然后使用 `` 来引用它。
    • 好的,我明白了。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多