XSL - 命名空间是什么?那是什么?

时间:2016-02-05 12:59:43

标签: xml xslt xslt-2.0

我知道在C ++和C中使用的命名空间的功能。 但我不明白XSLT中的这行代码:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

它的用途是什么?如果我错过这会怎么样? (如果我删除这一行,没有任何反应)...... 这指向什么?`

我在W3Cschools上读过一些关于这个的帖子......但我还是没有 理解......

提前致谢。

2 个答案:

答案 0 :(得分:4)

这个问题应该得到更好的解释。

这是一个名为 table的元素:

<table material="wood"
       legs="4" shape="rectangle" type="dining"/>

从其4个属性的值中可以清楚地看到,它描述了木制餐桌 四条腿矩形形状。

这是另一个 table 元素

<table name="Product">
  <columns>
    <column name="id"/>
    <column name="name" type="string"/>
    <column name="price" type="decimal"/>
    <column name="date-produced" type="date"/>
  </columns>
  <rows>
   <row id="1" name="bike" price="300" quantity="2"
               date-produced="2013-08-12"/>
  </rows>
</table>

这显然不是一件家具,但可能是关系数据库表

我们看到两个“表”元素具有不同的含义且没有任何共同之处 - 它们碰巧具有相同的名称,但它们属于不同的词汇

以下是可以属于不同词汇表的元素名称的更多示例

 <furniture:table/>
 <sql:table/>
 <resataurant:table/>
 <html:table/>
 <sql:column/>
 <architecture:column/>
 <table:column>
 <css:style/>
 <architecture:style/>
 <fashion:style/>

这里我们有三个不同的元素名称:“table”,“column”和“style”,每个都属于&gt; 1个词汇表。

这些元素代表了8种不同的词汇表:

  1. furnituresqlrestauranthtml的名称为 table
  2. sqlarchitecturetable名称为 column
  3. cssarchitecturefashion的名称为 style
  4. 命名空间的目的是识别给定名称所属的词汇表。换句话说,消除属于不同词汇表的两个相同名称的歧义

    以下是典型的 名称空间声明

      

    &lt; xsl:stylesheet version =&#34; 1.0&#34;
      xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"&GT;

    它将名称空间前缀名称空间URI (统一资源标识符)相关联。

    此命名空间声明的效果是名称:xsl:stylesheet属于命名空间,命名空间为-uri,字符串为“http://www.w3.org/1999/XSL/Transform”

    不同的名称空间前缀可以与同一个名称空间 - uri相关联 - 即使在同一个XML文档中也是如此。

    但是,命名空间URI必须是全局唯一的:XSLT命名空间始终是相同的字符串,无论与之关联的是什么前缀。

    前缀

    • 属性名称的一部分是"xmlns:"
    • 之后的部分
    • 不能包含字符":"
    • 如果属性名称仅为xmlns,则前缀为&#34;&#34; (空字符串)

    NS URI

    • 可以是任何字符串:"^%$23rt""http://myComp.com""my:my"
    • 必须是唯一的
    • 可以是有意义的网址。
    • 如果有意义的网址,则不需要存在包含该网址的网页。 XML处理器不会发出任何HTTP请求来访问此URL。

    请注意

    • 命名空间URI必须是唯一的:这是命名空间最重要的要求。
    • 可能(但没有必要)是一个有意义的网址 - 更重要的是字符串的唯一性。
    • 如果 NS URI是有意义的URL,则不要求存在具有此URL的页面。 没有为NS URI发出HTTP请求

    Common misconceptions

    现在,回答具体问题:

      

    我不明白XSLT中的这行代码:   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

         

    它的用途是什么?

    这是 XSLT名称空间的名称空间声明,用于定义 XSLT词汇表

    其目的是消除此命名空间中的任何元素和属性名称与其他词汇表中属于其他词汇表(或不属于任何词汇表(属于)的任何其他相同名称的出现)的歧义&#34;空&#34;词汇表。

      

    如果我错过了会怎么样?

    如果XML文档中没有指定XSLT名称空间声明,则:

    • XSLT处理器不会发现它理解的任何<xsl:stylesheet>声明,指令,元素或属性。它不会做任何工作,可能会报告错误。
    • 如果没有带前缀&#34; xsl&#34;的命名空间声明,但在文档中有带有此前缀的元素(或属性)名称,那么即使是XML解析器也会引发错误输入不是格式良好的XML文档。
      

    这是指向什么?

    如前所述,namespace-uri可以是任何字符串,可能不一定是语法上有效的URL。如果 是一个语法上有效的URL,则没有义务会有HTTP服务器为使用此URL的任何HTTP请求提供HTTP响应。

    XSLT处理器肯定不会发出任何此类HTTP请求 - 任何人都可以通过断开所有网络并执行任何XSLT转换来证明这一点 - 转换仍会产生结果。

    但在这种特定情况下,如果您在浏览器中尝试使用此URL,您会看到W3C对其众多用户友好,并且实际上提供了一个页面:

    The W3C "XSLT-Namespace" page

      

    我在W3Cschools上读了一些关于这个的帖子......但我还是没有   理解......

    W3Schools不被认为是关于XML / XSLT / XPath的好资源 - 如W3Fools所述

    关于XML,XML命名空间和XSLT的唯一权威来源是它们相应的规范:http://www.w3.org/TR/2008/REC-xml-20081126/http://www.w3.org/TR/2006/REC-xml-names-20060816/https://www.w3.org/TR/1999/REC-xslt-19991116(后者是XSLT 1.0规范 - 存在单独的规范对于XSLT 2.0和XSLT 3.0)

    但是,W3C规范的编写目的不是为了方便用户使用。如果有人想要了解有关XSLT和XML的更多信息,我会在Pluralsight上推荐我的视频课程:XSLT 2.0 and 1.0 Foundations - 本课程的第二个模块详细解释了XML命名空间的概念。

答案 1 :(得分:2)

  

如果我删除此行

,则没有任何反应

嗯,那不是真的。如果删除命名空间声明,样式表将停止工作。实际上,它不再是XSLT样式表了。

XSLT处理器使用命名空间来区分XSLT指令(处理器必须执行)和其他元素,例如文字结果元素(将被复制到输出树)。