我知道在C ++和C中使用的命名空间的功能。 但我不明白XSLT中的这行代码:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
它的用途是什么?如果我错过这会怎么样? (如果我删除这一行,没有任何反应)...... 这指向什么?`
我在W3Cschools上读过一些关于这个的帖子......但我还是没有 理解......
提前致谢。
答案 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种不同的词汇表:
furniture
,sql
,restaurant
和html
的名称为 table
sql
,architecture
和table
名称为 column
css
,architecture
和fashion
的名称为 style
。命名空间的目的是识别给定名称所属的词汇表。换句话说,消除属于不同词汇表的两个相同名称的歧义。
以下是典型的 名称空间声明:
&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"
请注意:
现在,回答具体问题:
我不明白XSLT中的这行代码:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
它的用途是什么?
这是 XSLT名称空间的名称空间声明,用于定义 XSLT词汇表
其目的是消除此命名空间中的任何元素和属性名称与其他词汇表中属于其他词汇表(或不属于任何词汇表(属于)的任何其他相同名称的出现)的歧义&#34;空&#34;词汇表。
如果我错过了会怎么样?
如果XML文档中没有指定XSLT名称空间声明,则:
<xsl:stylesheet>
声明,指令,元素或属性。它不会做任何工作,可能会报告错误。这是指向什么?
如前所述,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命名空间的概念。
答案 1 :(得分:2)
如果我删除此行
,则没有任何反应
嗯,那不是真的。如果删除命名空间声明,样式表将停止工作。实际上,它不再是XSLT样式表了。
XSLT处理器使用命名空间来区分XSLT指令(处理器必须执行)和其他元素,例如文字结果元素(将被复制到输出树)。