XSL - 命名空间有什么用?它是做什么的?

XSL - What is the namespace for? and what does it?

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

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

它有什么用?如果我错过了这个会怎样? (如果我删除这一行什么也不会发生)... 这指向什么?`

我已经在 W3Cschools 中阅读了一些关于此的帖子...但我仍然没有 明白了...

提前致谢。

Nothing happens if I delete this line

嗯,事实并非如此。如果删除命名空间声明,您的样式表将停止工作。事实上,它将不再是 XSLT 样式表。

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

这个问题值得更好的解释。

这是一个名为的元素 table:

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

从其 4 个属性的值可以清楚地看出,这描述了 woodendining table with 四条腿长方形形状。

这是另一个 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>

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

我们看到“table”这两个元素意义不同,没有共同点——它们恰好同名,但属于不同的词表 .

这里有一些可以属于不同词汇表的元素名称的更多示例:

 <furniture:table/>
 <sql:table/>
 <resataurant:table/>
 <html:table/>

 <sql:column/>
 <architecture:column/>
 <table:column>

 <css:style/>
 <architecture:style/>
 <fashion:style/>

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

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

  1. furnituresqlrestauranthtml 用于名称 table
  2. sqlarchitecturetable 用于名称 column
  3. cssarchitecturefashion 名称 style.

命名空间的目的是识别给定名称所属的词汇表。换句话说,消除属于不同词汇表的两个相同名称的歧义

这是一个典型的 命名空间声明:

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

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

这个命名空间声明的作用是名称:xsl:stylesheet 属于带有 namespace-uri 字符串 “http://www.w3.org/1999/XSL/Transform”

的命名空间

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

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

前缀:

  • "xmlns:" 之后的属性名称部分
  • 不能包含字符 ":"
  • 如果属性名称只是 xmlns 那么前缀是 ""(空字符串)

NS URI:

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

注意:

  • 名称空间 URI 必须是唯一的:这是对名称空间最重要的要求。
  • 可以(但没必要)是有意义的URL – 更重要的是字符串的唯一性。
  • 如果 NS URI 是一个有意义的 URL,这并不要求具有此 URL 的页面应该存在。 没有为 NS URI 发出 HTTP 请求


现在,回答具体问题:

I do not understand this line of code in XSLT: xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

What is it there for?

这是定义 XSLT 词汇表

XSLT 命名空间 的命名空间声明

其目的是消除此命名空间中的任何元素和属性名称与任何其他同名、属于其他词汇表(或不属于任何词汇(属于 "empty" 词汇)。

What would happen if I miss this?

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

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

And what is this pointing to?

如前所述,namespace-uri 可以是任何字符串,不一定是语法上有效的 URL。如果它 语法上有效的 URL,则没有义务为任何 HTTP 请求提供 HTTP 响应 URL ].

并且 XSLT 处理器绝对不会发出任何此类 HTTP 请求——任何人都可以通过断开与所有网络的连接并执行任何 XSLT 转换来证明这一点——转换仍然会产生它的结果。

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

I've read some Posts about this in W3Cschools... But I still didn't understood ...

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/, and 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 名称空间的概念。