需要XML中的命名空间

时间:2013-12-19 10:54:54

标签: xml xslt namespaces

我理解在XML中如果我对两个不同的标签有相同的tagName,那么为了将它们分开,我们在它之前加上命名空间以使其唯一。但是当我们说

时在顶部
<rootElement xmlns:myNameSpace="http://www.myNameSpace.com">

现在,为什么我们有这个http://www.myNameSpace.com?除了它将是独一无二的事实之外,它的用途是什么。

另外,我正在阅读有关xslt的内容,因为它也是一个XML,所以它将命名空间定义为

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

现在,首先,这个link究竟是什么告诉我的,它如何帮助xml渲染?那么除了独特之外,它还能提供什么吗?为什么要达到这样的程度呢?如果在XML中,我在两个标签之间存在冲突,我可以使用任意两个名称空间,比如namespace1和namespace2并使用它。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:6)

通常,除了唯一标识与其关联的元素之外,XML命名空间不起任何作用。

换句话说,字符串“http://www.myNameSpace.com”如下:

<rootElement xmlns:myNameSpace="http://www.myNameSpace.com">

完全是武断的。它没有必要指向任何地方。此外,所谓的前缀(在本例中为myNameSpace,“xmlns:”之后的部分)是任意的,只是说“http://www.myNameSpace.com”的简写方式。

话虽如此,保留一些:

1)命名空间可以帮助在大文件中构建XML数据,例如OpenXML格式的Microsoft Word文档:

这是典型OOXML中出现的命名空间的摘录:

xmlns:aml="http://schemas.microsoft.com/aml/2001/core"
xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

因此,尽管没有固有的理由可以使用单独的命名空间,但它有助于将XML词汇表划分为有意义的类别。

2)正如您所注意到的那样,对任意定义名称空间有一些限制:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

这将元素标识为属于XSLT名称空间。但是,除此之外,它意味着这样标记的元素由XSLT处理器识别为不仅仅是XML代码,而是要执行的XSLT指令。

链接“http://www.w3.org/1999/XSL/Transform”指向XSLT规范,其中规定了转换XML文档的规则。现在,回答您的问题:声明命名空间不会帮助转换。相反,如果省略XSLT处理器,它就无法识别XSLT代码。

可以定义命名空间“namespaceA”和“namespaceB”:

xmlns:nsA="namespaceA"
xmlns:nsB="namespaceB"

但您不能使用它们来转换XML,除非您只想更改前缀:

xmlns:nsA="http://www.w3.org/1999/XSL/Transform"

这被认为是不好的做法。

答案 1 :(得分:3)

你几乎已经钉了它,即xmlns是唯一的。此外,它必须是W3C spec的有效URI。

来自维基百科:

  

命名空间名称是统一资源标识符(URI)。通常情况下,   为给定XML词汇表的命名空间选择的URI描述了一个   资源在作者或组织的控制下定义   词汇表,例如作者Web服务器的URL。然而   命名空间规范不要求也不建议   名称空间URI用于检索信息;简单地对待它   XML解析器作为字符串。

Re:XSLT

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

这意味着命名空间前缀xsl现在对于xmlnshttp://www.w3.org/1999/XSL/Transform”具有“别名” - 即文档中引用xsl前缀的所有其他标识符属于在这个命名空间中。

回复:评论

xsl作为前缀的选择是xslt样式表的惯例。没有什么可以阻止你使用另一个别名,例如:

<?xml version="1.0" encoding="utf-8"?>
<bob:stylesheet version="1.0" xmlns:bob="http://www.w3.org/1999/XSL/Transform">
   <bob:template match="/xml">
      <bob:value-of select="element"/>
   </bob:template>
</bob:stylesheet>

但这不会让你赢得任何朋友。

您也可以选择不使用前缀,但是您需要在任何地方重复xmlns e.g。

<value-of select="element" xmlns="http://www.w3.org/1999/XSL/Transform"/>

答案 2 :(得分:1)

XML命名空间的本质是从抽象数据模型的角度来看元素/属性/类型/等的名称。由两部分组成,命名空间名称(通常称为“命名空间URI”)和本地部分

具有命名空间http://www.w3.org/1999/XSL/Transform和本地部分stylesheet的元素与具有命名空间http://example.com和本地部分stylesheet的元素不同,后者又与具有命名空间的元素stylesheet不同本地名称<{http://www.w3.org/1999/XSL/Transform}stylesheet version="1.0"> <{http://www.w3.org/1999/XSL/Transform}template match="/"> <!-- ... --> </{http://www.w3.org/1999/XSL/Transform}template> </{http://www.w3.org/1999/XSL/Transform}stylesheet> 名称空间。 XSLT处理器将第一个处理为指令,第二个和第三个处理器仅作为要输出的文字元素。

如果必须为每个元素输入完整的命名空间名称,那将是非常冗长的:

xmlns

所以你使用xmlns:prefixxsl声明来将短(或空)标签与完整的命名空间名称相关联,然后使用这些前缀和本地名称来为每个元素提供全名。就涉及名称空间的XML处理器而言,前缀不是名称的一部分 - 只要它绑定到正确的名称空间,您选择使用的前缀就没有区别。

但是,大多数人都倾向于使用常规名称空间的常规前缀,例如{4}用于XSLT,xsxsd用于XML模式,xsi用于{如果你正在编写使用其中一个词汇表的XML,那么如果其他人将来可能需要阅读你的文档,那么坚持这些约定是个好主意。