目标命名空间(targetNamespace)和xmlns:target有什么区别?

44

targetNamespace 的作用是什么?

<schema xmlns="http://www.w3.org/2001/SchemaXML"
        targetNamespace="http://www.example.com/name"
        xmlns:target="http://www.example.com/name">

我理解xmlns="http://www.w3.org/2001/SchemaXML定义了Schema XML命名空间。

我也知道xmlns:target="http://www.example.com/name"为自己的词汇表定义了命名空间,如果我使用前缀" target"创建自己的模式,它将作为URI http://www.example.com/name 的代理或占位符。

这似乎足以定义命名空间参与者所需的边界和词汇表。那么为什么需要一个 targetNamespace 属性来重复 http://www.example.com/name 命名空间呢?

3个回答

50

以下是详细解答:targetNamespace和没有前缀的xmlns有什么区别?

简单概括一下:

  • targetNamespace="" - 当前XML文档是一个模式文件,该属性定义该模式的目标命名空间,或对其进行验证。

  • xmlns="" - 为所有没有前缀的元素(即<yada:elementName>中不包含yada:)定义当前文档中的默认命名空间。

  • xmlns:target="" - 此处只是使用前缀target:来定义自己的名称空间,与前两种特殊情况无关。


6
这个属性定义了该模式所针对的命名空间。我觉得这很令人困惑。这个模式是在“针对”一个命名空间?因此,如果我创建了一个targetNamespace="google.com"的模式,我就在Google上创建了一个命名空间?然后呢?会影响到其他人已经创建的相同的模式吗?还有,使用哪个前缀? - CodyBugstein
1
@Imray 这有点令人困惑,我认为 XSL 文档定义了一个 XML 结构,命名空间只是一种唯一标识该结构的方式,以便稍后当 XML 文档引用它时(使用上面显示的 xmlns= 或 xmlns:somelabel=),它具有不与您可能引用的其他 XSL 文档冲突的名称,这样说清楚了吗? - Shaun
一个 .xsdtargetNamespace 通常与它验证的 .xmlxsi 相同吗?我知道 xsi 是传统的。 - Minh Nghĩa
1
@MinhNghĩa xsi和xsd是命名空间前缀,但你说得对,它们通常用于指代两个特定的东西。请查看此答案以了解它们之间的区别:https://dev59.com/BlgR5IYBdhLWcg3wqO1W#41041892 - Shaun

9

目标命名空间声明了一个命名空间,使得其他的XML和XSD文档可以引用这个模式。在此情况下,目标前缀指的是相同的命名空间,您可以在此模式定义中使用它来引用其他元素、属性、类型等,这些元素、属性、类型也都在此相同的模式定义中定义。


3

xmlns:target="http://www.example.com/name"中,“target”前缀并没有什么特殊之处。模式处理器怎么知道你想要它成为模式的目标命名空间呢?targetNamespace的作用就是声明模式组件所属的命名空间。

需要注意的是,并不是模式文档中的所有内容都归入目标命名空间中。请注意“schema”元素上的“elementFormDefault”和“attributeFormDefault”属性以及“element”和“attribute”元素上的“form”属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接