【问题标题】:xmln:tns and targetNamespacexmln:tns 和 targetNamespace
【发布时间】:2013-06-22 03:31:47
【问题描述】:

我看到一些 XSD 架构文档在其顶部 schema 元素中声明了 targetNamespacexmlns:tns 属性。例如。以下一张采取from here。它们似乎也具有相同的字符串值。我了解targetNamespace 的作用,但除此之外xmlns:tns 还能做什么?

<?xml version="1.0" encoding="UTF-8"?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/Product"
    xmlns:tns="http://www.example.org/Product"
    elementFormDefault="qualified">
...

【问题讨论】:

    标签: xsd xml-namespaces


    【解决方案1】:

    它允许您稍后在架构中引用命名空间。例如,如果您声明了一个命名类型,然后还想声明该类型的元素

    <complexType name="someType">
      <!-- ... -->
    </complexType>
    
    <element name="someElement" type="tns:someType" />
    

    简单地说type="someType" 是行不通的,因为那将引用http://www.w3.org/2001/XMLSchema 命名空间(架构文件的xmlns="...")中的(不存在的)someType,而不是@ 中的那个987654326@命名空间。

    【讨论】:

    • 好的,所以'tns'在这个意义上就像绑定到命名空间的任何其他前缀一样,它没有任何特殊意义,就像所有其他前缀一样,对吧?
    • @MarcusJuniusBrutus 确实,你可以使用任何你喜欢的前缀。前缀 tns 在这种情况下很常见,作为“目标名称空间”的助记符,但您也可以使用 productns0 或其他任何名称。
    • 如果你有“xmlns:tns”你需要“targetNamespace”吗?我正在尝试使用来自另一个组的 XSD,它有“xmlns:tns”但没有“targetNamespace”。
    • @MikeStoddart 它们通常一起出现,仅仅是因为当你有一个带有 targetNamespace 的模式时,你需要一个像 tns: 这样的前缀才能引用在来自其他地方的架构。如果架构没有targetNamespace,那么它的类型不在命名空间中,因此交叉引用不需要前缀。可能只是因为 xmlns:tns 是早期编辑留下的,并且架构中的任何引用实际上都没有使用 tns:anything
    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多