gpt4 book ai didi

xsd - 使用从导入导入的 xsd 中的类型

转载 作者:行者123 更新时间:2023-12-04 15:24:36 27 4
gpt4 key购买 nike

给定一个顶级 xsd 导入第二个级别,然后导入第三个级别,是否可以在第一个级别中使用第三个类型?还是第一个必须直接导入第三个?

最佳答案

好问题!
从阅读规范来看,我真的无法分辨。它没有明确解决传递导入的问题。

在 Primer(第 0 部分)中,他们只讨论了一个级别的导入:http://www.w3.org/TR/xmlschema-0/#import

在 Structure(第 1 部分)中,它也只定义了直接导入 http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#composition-schemaImport由于它谈到“一种处理这种外部组件的方法”(我认为这意味着命名空间),也许可以合理地假设需要一种明确的方式来处理导入的模式 - 换句话说,导入中需要一个显式的命名空间每一个。

谷歌搜索显示其他人也被这个问题搞糊涂了:

  • http://xsd.stylusstudio.com/2002Apr/post00021.htm
  • http://xsd.stylusstudio.com/2005Mar/post05007.htm

  • 这些帖子最令人担忧的是,不同的 xsd 处理器具有不同的行为——这表明处理器的作者也感到困惑。

    尽管自这些帖子(2002 年、2005 年)以来可能已经发生了变化,但最明智的做法似乎是避免这个问题,而只使用直接导入,因为这将适用于所有处理器。

    正如我所说:好问题。

    这是一个测试,用于检查 xsd 处理器(当然,这不能保证它适用于使用其他 xsd 处理器的其他人......)。我发现我最喜欢的一个 (xmllint) 不允许传递导入。

    测试是三个模式:a.xsd 导入 b.xsd,然后导入 c.xsd; c.xsd 中定义的类型是从 a.xsd 引用的:
    <!-- a.xsd -->
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.c.com" targetNamespace="http://www.a.com">
    <xsd:import namespace="http://www.b.com" schemaLocation="b.xsd"/>
    <!-- UNCOMMENT FOR DIRECT IMPORT
    <xsd:import namespace="http://www.c.com" schemaLocation="c.xsd"/>
    -->
    <xsd:element name="eg" type="c:TypeC"/>
    </xsd:schema>

    <!-- b.xsd -->
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:import namespace="http://www.c.com" schemaLocation="c.xsd"/>
    </xsd:schema>

    <!-- c.xsd -->
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.c.com">
    <xsd:simpleType name="TypeC">
    <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>
    </xsd:schema>


    <!-- a.xml -->
    <eg xmlns="http://www.a.com">hello world</eg>

    $ xmllint --schema a.xsd a.xml --noout
    a.xsd:6: element element: Schemas parser error : Element
    '{http://www.w3.org/2001/XMLSchema}element', attribute 'type': References from
    this schema to components in the namespace 'http://www.c.com' are not allowed,
    since not indicated by an import statement.
    WXS schema a.xsd failed to compile

    错误信息是: References from this schema to components in the namespace 'http://www.c.com' are not allowed, since not indicated by an import statement. ,这表明 xmllint 的开发人员至少非常确定导入不是可传递的。

    关于xsd - 使用从导入导入的 xsd 中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735887/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com