xml文档中XMLNS URL的含义是什么

时间:2012-07-22 14:05:31

标签: xml xslt xml-parsing xsd

我想知道,xml文档中的xmlns网址是否有任何实际意义?

我曾参考link。现在当我改变xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 对别的东西,它停止了工作。 w3c表示名称空间名称(OR URL)仅用于区分xml标记。而不是在更改网址后它无法正常工作的原因。

所以我想,可能是它与该URL有关,所以尝试了localy(没有互联网)..参见下面的例子..

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。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

  

这个URL在xmlns

中是否有任何实际意义

这是一个基本的XML问题 - 而不是XSLT问题。

namespace-uri用于识别特定的基于XML的语言 - 通过将此labguage的所有元素名称放在同一名称空间中(使所有这些名称具有相同的名称空间-uri)。

除此之外,命名空间uri没有其他用途。

因此,所有XSLT元素(和一些属性)都在"http://www.w3.org/1999/XSL/Transform"命名空间中,任何名称没有此命名空间的元素都是而不是 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 namespace-uri修改为其他内容,您实际上是这样说的:以关联前缀(在您的情况下为“xsl”)作为前缀的名称属于"http://www.abc.com"命名空间,而不是到XSLT名称空间 - 因此它们不是XSLT元素。

当然,当XSLT处理器发现它已经被非XSLT元素的元素提供时,XSLT处理器会抱怨这一点。

答案 2 :(得分: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元素,您需要正确的命名空间和正确的本地名称。