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 个属性的值可以清楚地看出,这描述了 wooden、dining 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 个不同的词汇表:
furniture
、sql
、restaurant
和 html
用于名称 table
sql
、architecture
和 table
用于名称 column
css
、architecture
和 fashion
名称 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 名称空间的概念。
我知道在 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 个属性的值可以清楚地看出,这描述了 wooden、dining 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 个不同的词汇表:
furniture
、sql
、restaurant
和html
用于名称table
sql
、architecture
和table
用于名称column
css
、architecture
和fashion
名称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 名称空间的概念。