XML文档中的XMLNS URL是什么意思?

8

我想知道,在XML文档中,xmlns URL是否有任何实际意义?

我参考了链接。现在当我将xmlns:xsl="http://www.w3.org/1999/XSL/Transform"更改为其他内容时,它停止工作了。W3C说命名空间名称(或URL)只是用于区分XML标记。那么为什么更改URL后它不起作用了呢?

所以我想,可能与该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.

所以,唯一的问题是,在xmlns中是否有任何真正的意义。如果有的话,为什么在没有互联网的情况下它可以工作,而在改变xsl中的url后却不能工作。
3个回答

10

它不是一个URL,而是一个URI。也就是说,它是一个标识符(名称),而不是一个位置(地址)。

XML中的命名空间类似于Java中的包名;不同的词汇在不同的命名空间中定义,以防止冲突并声明对词汇定义的所有权。与包名类似,命名空间成为该命名空间中元素名称的隐式部分,因此在Docbook命名空间中的<para>与在DITA命名空间中的<para>没有关联。

James Clark在这里写了一个有关命名空间的好教程:http://www.jclark.com/xml/xmlns.htm


这个URL是否会被某些方式访问(例如XML XSD验证)?我猜不会,对吧? - tObi
2
就像我说的,它不是一个URL,而是一个URI。一个标识符,而不是一个地址。它从来没有被解引用来从网络中获取资源。 - Michael Kay
谢谢。我也是这么想的,但只是想明确一下,因为它被我们公司的防火墙屏蔽了,而我正在反对这种做法。 - tObi

4
在xmlns中,这些URLS是否有任何实际含义?
这是一个基本的XML问题,不是XSLT问题。
namespace-uri的目的是识别特定的基于XML的语言,通过将该语言的所有元素名称放在同一个命名空间中(使它们都具有相同的命名空间URI)。
除此之外,命名空间URI没有其他用途。
因此,所有的XSLT元素(和一些属性)都在"http://www.w3.org/1999/XSL/Transform"命名空间中,任何名称没有这个命名空间URI的元素都不是XSLT元素。
以下是更多的例子:
- XML Schema: "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元素时,它会抱怨。

谢谢你的回答,你提到的命名空间类似于Java的命名空间吗?这些命名空间已经在浏览器中可用了吗? - hardik
1
@Hardik:与其他语言的命名空间有一些相似之处,但 XML 命名空间 不是 分层的——它们只是一组平面字符串。至于“浏览器中命名空间的可用性”,我们通常称其为对某种语言的浏览器支持。例如,实现 HTML5 的浏览器支持 SVG 和 MathML,并允许在 XML 文件/文档上执行 XSLT,如果 XML 文档以特定的 PI(处理指令)开头。 - Dimitre Novatchev

0

浏览器(或任何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元素,您需要正确的命名空间和本地名称。


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