2011-05-19 67 views

回答

3

x:是在你的XML命名空间标识符。对于元素和属性,XML子树可以有一个“默认”名称空间(由xmlns='...'设置)。如果您需要其他名称空间中的元素或属性,则需要定义一个前缀,例如xmlns:x='...'。您从该名称空间使用的元素和属性需要以x:作为前缀。一个常见的一个我是

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" 

,然后要求我为use元素做到以下几点:

<use xlink:href='#foo'/> 

在这种情况下,use元素来自SVG,而href属性来自于XLink的。两者都不同,但在某些地方兼容规格。

而这基本上是命名空间是:

  • 组不同的XML使用成连贯的部分
  • 让他们在一个XML
  • 可能被用来避免名称冲突(如果有两个命名空间并且都支持名为foo一个元素,那么你需要指定要两个foo S的

通过这种方式,名称空间与许多编程语言中的工作方式没有多大区别。您可以通过名称空间查看您导入的内容,如上面SVG情况下的库。编写SVG的人注意到已经有了一个允许链接到任意XML元素(XLink)的规范,他们只是重新使用它。在其他情况下,例如WPF,存在名称空间来分隔演示框架的声明UI内容和与代码接口所需的粘合属性。例如。窗口有可能是这样的:

<Window 
    x:Class="W" 
    Height='500' 
    Width='500' 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

时才需要Class属性编译器知道相应的代码隐藏类,它没有窗户上的任何明显的差异。

另一个示例是XSLT,您可以在其中定义XML文档的转换。 XSLT指令和输出模板都是XML。您通常使用XSLT的元素一个明确的命名空间:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

,这样就可以发出生成的XML,像这样:

<xsl:if test="Content/Chapter"> 
    <xsl:variable name="text"><xsl:value-of select="$trans//item[@name='content'][lang($lang)]" /></xsl:variable> 
    <h2><xsl:value-of select="$text"/></h2> 
    <ol> 
     <xsl:apply-templates select="Content" mode="TableOfContents"/> 
    </ol> 
</xsl:if> 

如果我让xsl:命名空间默认命名空间,那么XSLT处理器无法告诉我从实际的指令中生成HTML。如果您的代码和数据使用相同的格式并且居住在相同的地方,那么这是一个问题。我相信Lisp通过用单引号标记数据解决了这个问题。

至于名称空间是一个URI,这可能只是一个W3C的事情。这些URI不需要任何东西。他们只是标识符。它们并不意味着被检索。使用名称空间的XML的程序必须知道它可以处理和适当行事的名称空间。

6

“x:”是一个名为x的名称空间别名。在元素上方的某个地方会有一个指向某个url的xmlns:x属性,这个url通常并不重要,它只是一个名字空间的标识符。

“x”只是该文件的本地名称,只要foo:在各处都使用x:被使用,它也可以是xmlns:foo。

命名空间通常由xml处理器使用,以确保它们正在寻找正确的元素(例如对于xlst变换),而不是用户在xml中定义的自定义元素。

您可以阅读更多有关XML命名空间here

+0

如果提供了一个URL,但无法访问(无网络连接),会发生什么情况? – 2011-05-19 10:32:20

+3

@liortal:它们并不意味着被检索。他们只是名字。它们看起来像URI,但在那个地方没有东西(至少没有规定)。 – Joey 2011-05-19 10:35:31

相关问题