xml文档中的XMLNS URL是啥意思
Posted
技术标签:
【中文标题】xml文档中的XMLNS URL是啥意思【英文标题】:What is the meaning of XMLNS URL in xml documentxml文档中的XMLNS URL是什么意思 【发布时间】:2012-07-21 00:05:20 【问题描述】:我想知道,xml文档中的xmlns urls有什么真正的含义吗?
我曾参考 link 。现在当我改变xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
别的东西,它停止工作。 w3c 说命名空间名称(或 URL)只是为了区分 xml 标签。比为什么更改网址后它不起作用。
所以我想,可能与那个 URL 有关,所以在本地尝试(没有互联网).. 见下面的例子..
XML 文档。 (first.xml)
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="first.xsl"?>
<!-- Edited by XMLSpy® -->
<catalog>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
<cd>
<title>Pavarotti Gala Concert</title>
<artist>Luciano Pavarotti</artist>
<country>UK</country>
<company>DECCA</company>
<price>9.90</price>
<year>1991</year>
</cd>
<cd>
<title>The dock of the bay</title>
<artist>Otis Redding</artist>
<country>USA</country>
<company>Atlantic</company>
<price>7.90</price>
<year>1987</year>
</cd>
</catalog>
XSLT 文档 (first.xsl)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
所以,它在本地运行良好。但如果我将xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
更改为xmlns:xsl="http://www.abc.com"
之类的其他内容,则会在浏览器中出现错误。
Error loading stylesheet: Parsing an XSLT stylesheet failed.
所以,唯一的问题是,这个 URL 在 xmlns 中是否有任何真正的含义。如果是的话,它比为什么它在没有互联网的情况下工作而不是通过更改 xsl 中的 url 来工作。
【问题讨论】:
【参考方案1】:这不是 URL,而是 URI。也就是说,它是一个标识符(一个名称),而不是一个位置(一个地址)。
XML 中的命名空间就像 Java 中的包名;在不同的命名空间中定义了不同的词汇表,以防止冲突并声明对词汇表定义的所有权。与包名称一样,命名空间成为该命名空间中元素名称的隐含部分,因此 Docbook 命名空间中的 <para>
与 DITA 命名空间中的 <para>
没有任何联系。
James Clark 在这里写了一篇关于命名空间的好教程:http://www.jclark.com/xml/xmlns.htm
【讨论】:
这个网址是否曾经以某种方式访问过(例如通过 xml xsd 验证)我猜不对? 正如我所说,它不是 URL,而是 URI。标识符,而不是地址。从网络上获取资源永远不会被取消引用。 谢谢。我是这么想的,但只是想澄清一下,因为它被我公司的防火墙阻止了,我反对它【参考方案2】:xmlns中这个URLS有什么实际意义
这是一个基本的 XML 问题——不是 XSLT 问题。
namespace-uri 用于识别特定的基于 XML 的语言——通过将这个 labguage 的所有元素名称放在同一个命名空间中(使它们都具有相同的 namespace-uri)。
除此之外,命名空间 uri 没有其他用途。
因此,所有 XSLT 元素(和一些属性)都在 "http://www.w3.org/1999/XSL/Transform"
命名空间中,并且任何名称没有此命名空间 uri 的元素不是 XSLT 元素。
这里有更多例子:
XML 架构:"http://www.w3.org/2001/XMLSchema"
SVG:"http://www.w3.org/2000/svg"
XSL-FO:http://www.w3.org/1999/XSL/Format
XHTML:"http://www.w3.org/1999/xhtml"
XPath 2.0 和 XQuery 函数:http://www.w3.org/2005/xpath-functions
XLink:"http://www.w3.org/1999/xlink"
MathML:"http://www.w3.org/1998/Math/MathML"
因此,通过将样式表中的 XSLT 命名空间 uri 修改为其他内容,您实际上是在说:以相关前缀(在您的情况下为“xsl”)为前缀的名称属于 "http://www.abc.com"
命名空间,而不是XSLT 命名空间——因此它们不是 XSLT 元素。
当然,当 XSLT 处理器发现它已被提供了不是 XSLT 元素的元素时,XSLT 处理器会抱怨这一点。
【讨论】:
感谢您的回答,您提到的命名空间就像 java 命名空间?并且这些名称空间已经在浏览器中可用了? @Hardik:与其他语言的命名空间有一些相似之处,但是 XML 命名空间不是分层的——它们只是一组扁平的字符串。至于“浏览器中命名空间的可用性”,我们通常将此浏览器支持称为一种或另一种语言。例如,实现 HTML5 的浏览器支持 SVG 和 MathML,如果 XML 文档以特定 PI(处理指令)开头,则允许在 XML 文件/文档上执行 XSLT。【参考方案3】:浏览器(分别是任何 XSLT 处理器)支持在命名空间 http://www.w3.org/1999/XSL/Transform
中带有 XSLT 元素的 XSLT 语言。如果您使用<?xml-stylesheet type="text/xsl" href="first.xsl"?>
链接到不是XSLT 样式表的XML 文档,那么浏览器(分别是XSLT 处理器)当然不理解代码。在 XML 世界中,项目的限定名称由名称空间和本地名称组成,任何工具仅支持已知名称。如果您将 XHTML 作为 XML 提供给浏览器,那么您需要确保为 XHTML 元素使用 XHTML 命名空间 http://www.w3.org/1999/xhtml
,否则浏览器将无法识别您的元素,即使它们碰巧与 XHTML 具有相同的本地名称元素。 XSLT 代码也是如此,要让浏览器将元素识别为 XSLT 元素,您需要正确的名称空间和正确的本地名称。
【讨论】:
以上是关于xml文档中的XMLNS URL是啥意思的主要内容,如果未能解决你的问题,请参考以下文章