这个问题值得更好的解释。
这是一个名为的元素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”,每个都属于> 1个词汇表。
这些元素代表了 8 个不同的词汇表:
-
furniture、sql、restaurant 和 html 的名称 table
-
sql、architecture 和 table 用于名称 column
-
css、architecture 和 fashion 用于名称 style。
命名空间的目的是识别给定名称所属的词汇表。换句话说,消除属于不同词汇的两个相同名称的歧义。
这是一个典型的 命名空间声明:
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:
- 可以是任何字符串:
"^%$23rt"、"http://myComp.com"、"my:my"
-
必须是唯一的。
-
可能是有意义的网址。
- 如果 URL 有意义,则不需要存在具有该 URL 的页面。 XML 处理器不会发出任何 HTTP 请求来访问此 URL。
请注意:
-
命名空间 URI 必须是唯一的:这是命名空间最重要的要求。
-
可以(但不是必须)是一个有意义的 URL——更重要的是字符串的唯一性。
-
如果 NS URI 是有意义的 URL,则不需要存在具有此 URL 的页面。 没有为 NS URI 发出 HTTP 请求。
现在,回答具体问题:
我不明白 XSLT 中的这行代码:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
它有什么用?
这是定义 XSLT 词汇表
的
XSLT 命名空间 的命名空间声明
其目的是消除此命名空间中的任何元素和属性名称与任何其他出现的相同名称、属于其他词汇表(或不属于任何词汇表(属于“空”词汇)。
如果我错过了会发生什么?
如果 XML 文档中没有指定 XSLT 命名空间声明,则:
- XSLT 处理器不会发现任何它理解的
<xsl:stylesheet> 声明、指令、元素或属性。它不会做任何工作,并且可能会报告错误。
- 如果没有带有前缀“xsl”的命名空间声明,但在文档中存在带有此前缀的元素(或属性)名称,那么即使是 XML 解析器也会引发错误,即输入不是井格式的 XML 文档。
这指向什么?
如前所述,namespace-uri 可以是任何字符串,不一定是语法上有效的 URL。如果它是在语法上有效的 URL,则没有义务必须有一个 HTTP 服务器可以为具有此 URL 的任何 HTTP 请求提供 HTTP 响应。
XSLT 处理器绝对不会发出任何这样的 HTTP 请求——任何人都可以通过断开与所有网络的连接并执行任何 XSLT 转换来证明这一点——转换仍然会产生结果。
但在这种特定情况下,如果您在浏览器中尝试使用此 URL,您会发现 W3C 对其众多用户很友好,并且实际上提供了一个页面:
我在 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 命名空间的概念。