这么多命名空间有什么意义呢

时间:2014-01-23 13:38:54

标签: java xml xslt xml-namespaces

所以在我的一个xslt文件中,我看到了

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:myxsl="urn:schemas-microsoft-com:xslt"
    xmlns:xsl2="http://www.w3.org/TR/xslt20/" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:java="http://xml.apache.org/xalan/java" 
    xmlns:mine="com.my.example.impl.BaseImpl"
    xmlns:m="com.my.example.util.CustomXsltHashMap"  
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
    exclude-result-prefixes="myxsl java s mine m xs xsl2">

有人可以告诉我这里的每条线是什么意思吗?我真的很感激这些名称空间及其用途的逐行解释?

我正在以某种方式在Java服务中使用xslt转换。 (不是我的代码)。

由于

5 个答案:

答案 0 :(得分:7)

只是为了澄清这一点:我认为我有told you already命名空间本身没有意义。

所以,你应该已经知道了

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

是与XSLT转换关联的命名空间。在这种情况下,任何带有xsl前缀的内容都被解释为对XSLT处理器的指令。


类似地,

xmlns:myxsl="urn:schemas-microsoft-com:xslt"

允许元素与MSXSL脚本相关联,如here所述。


下一个命名空间看起来与第一个命名空间类似,你不觉得吗?

xmlns:xsl2="http://www.w3.org/TR/xslt20/"

前缀为xsl2的元素可能是XSLT 2.0独有的,因为链接指的是XLST 2.0的规范。


下一个涉及使用XML Schema:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

可以根据模式验证XML文档,模式本质上是对应该包含的内容以及内容组织方式的描述。


我认为你应该能够自己理清其余部分。谷歌搜索命名空间URI怎么样?

答案 1 :(得分:5)

http://www.w3.org/1999/XSL/Transform是W3C XSLT编程语言的命名空间,因此它是XSLT代码中所有指令的命名空间。

http://www.w3.org/2001/XMLSchema是W3C XML模式语言的命名空间,它通常在XSLT 2.0样式表中用作XSLT / XPath 2.0的类型系统,后来构建在模式语言之上;在XSLT 1.0样式表中使用该命名空间是不寻常的,但是你没有显示很多代码,所以很难说出为什么样式表会声明它。

urn:schemas-microsoft-com:xslt是Microsoft用于通过其XSLT 1.0处理器实现提供专有扩展功能和元素的命名空间。 http://www.w3.org/TR/xslt20/是XSLT 2.0规范的位置,但我不认为它通常用作命名空间。

Xalan是来自Apache软件基础的XSLT 1.0处理器,但其文档http://xml.apache.org/xalan-j/extensions.html表示扩展名称空间为http://xml.apache.org/xalan,而不是代码中使用的http://xml.apache.org/xalan/java,因此我可以'告诉我为什么该代码段有http://xml.apache.org/xalan/java

SOAP也是一个W3C规范,它有各种版本,我认为命名空间http://schemas.xmlsoap.org/soap/envelope/用于SOAP 1.1信封部分。样式表可能需要处理SOAP消息,因此需要声明该命名空间以选择或匹配该命名空间中的输入元素。

其他两个名称空间可能用于访问扩展对象,这是非常特定于处理器的。

答案 2 :(得分:1)

exclude-result-prefixes="myxsl java s mine m xs xsl2"

该行告诉我们不要在XML输出中包含每个给定命名空间的名称空间声明。没有它,你会在输出中有很多xmlns:xxx="..."声明。

答案 3 :(得分:1)

我怀疑它是一个Xalan样式表,它大量使用外部Java方法的Xalan调用约定。由于此调用约定将XML命名空间映射到Java类,因此可能导致命名空间的扩散。

答案 4 :(得分:-1)

您可以谷歌搜索命名空间(使用"http://www.w3.org/1999/XSL/Transform",即保持对Google的引用知道您正在寻找整个命名空间)。这应该会给你一些有用的结果。

你在这里看到如此多的命名空间的原因是XSLT错误地使用XML作为定义转换的文件格式。 XML没有范围(如Java或其他实际编程语言)。相反,他们使用命名空间来说“这个name元素意味着......”。

因此,如果您在结果中生成XML并且想要<output>,则需要一种方法来告诉您的XSLT工具这与<xsl:output>不同。

这会泄漏到所有内容中,这反过来会产生如此长的命名空间列表,特别是当您遇到XSLT的许多缺点之一时(就像它需要5行Java或500行XSLT - >写一个Java插件)。

这也意味着仅从名称空间声明中就不清楚它的含义。它可能会触发一个插件,可能需要将XML输出添加到样式表中,或者它可能是一个不知道所有这些奇怪字符串意味着什么的人所做的删除和浪费。

祝你好运。