我理解在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并使用它。
我在这里缺少什么?
答案 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
现在对于xmlns
“http://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:prefix
和xsl
声明来将短(或空)标签与完整的命名空间名称相关联,然后使用这些前缀和本地名称来为每个元素提供全名。就涉及名称空间的XML处理器而言,前缀不是名称的一部分 - 只要它绑定到正确的名称空间,您选择使用的前缀就没有区别。
但是,大多数人都倾向于使用常规名称空间的常规前缀,例如{4}用于XSLT,xs
或xsd
用于XML模式,xsi
用于{如果你正在编写使用其中一个词汇表的XML,那么如果其他人将来可能需要阅读你的文档,那么坚持这些约定是个好主意。