XML - 试图掌握命名空间 URI 的概念

Posted

技术标签:

【中文标题】XML - 试图掌握命名空间 URI 的概念【英文标题】:XML - Trying to grasp the concept of namespace URI 【发布时间】:2018-01-14 22:49:58 【问题描述】:

如果我的 XSL 具有以下标题,则不会出现错误:

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

但如果我更改 xsl 命名空间 URI...:

<xsl:stylesheet version="1.0" xmlns:xsl="https://www.w3schools.com/xml/xml_namespaces.asp"

...我收到一个错误:

javax.xml.transform.TransformerConfigurationException 

我想我不理解命名空间 URI 的概念,因为我认为它可以是任何 URL(更不用说 URN),只要它在 XML/XSL 文档中是唯一的。显然不是。我尝试更改 URI 来测试这个理论。


在https://www.w3schools.com/xml/xml_namespaces.asp,我们可以阅读以下声明:

解析器不使用命名空间 URI 来查找信息。

使用 URI 的目的是给命名空间一个唯一的名称。

但是,公司经常使用命名空间作为指向包含命名空间信息的网页的指针。

第一个语句的意思是我们不关心URI指向的网页是什么,那为什么我不能将它设置为指向任何我想要的页面,甚至是一个不存在的页面呢?为什么一定要专门http://www.w3.org/1999/XSL/Transform?

此外,稍后我们可以在上面的链接中阅读:

统一资源标识符 (URI) 是标识 Internet 资源的字符串。

因此,正因为如此,并且因为“使用 URI 的目的是给命名空间一个唯一的名称”,这是否意味着 命名空间 URI 必须是一个 URL(同样,不提到我绝对无法理解的 URN),这意味着我无法设置这样的命名空间:

xlmns:foo="A_random_but_unique_string"

我会以来自同一链接的这句话结束:

命名空间“http://www.w3.org/1999/XSL/Transform”标识 html 文档中的 XSLT 元素

所以现在这意味着解析器肯定必须使用命名空间 URL 来查找信息(命名空间的元素),不是吗?

【问题讨论】:

【参考方案1】:

它与解析 URL(和下载模式)无关。尽管两个示例中的 XML 看起来相同:“xsl:stylesheet”,但您的输入被读取为 stylesheet 元素(由命名空间 https://www.w3schools.com/xml/xml_namespaces.asp 标识)。

Java 程序需要一个 stylesheet 元素(由命名空间 http://www.w3.org/1999/XSL/Transform 标识),但是由于找不到它,因此会引发异常。

【讨论】:

感谢您的回复。如果它甚至不需要从该 URL 中提取任何信息,为什么它会期望来自 URI w3.org/1999/XSL/Transform 标识的命名空间中的样式表元素?我的意思是,Java 程序不知道来自这个 URL 的样式表元素是什么!无论 URI 是什么,样式表都是样式表。 因为样式表不是随机/自定义格式,而是 w3 标准。 Java 已经拥有该标准的模式定义 (XSD),因此在准备转换时,它会尝试查看这是否符合其预期。它不知道如何解释来自 w3schools 的样式表,但它知道它可以解析/解释一个验证 w3.org 样式表模式的 XML 文件(由……那个确切的 URI 唯一标识)。 简短回答:根据样式表的 XSD,具有 w3schools URI 的样式表无效。

以上是关于XML - 试图掌握命名空间 URI 的概念的主要内容,如果未能解决你的问题,请参考以下文章

XML 元素名称中包含的 XSLT 命名空间 URI

单独的 xslt-replace 命名空间 uri

“clr-namespace” URI 指的是程序集中未包含的命名空间

添加空的默认 XML 命名空间 xmlns="" 属性?

WCF 客户端,XML 命名空间前缀导致空对象

如何使用 XPath 忽略命名空间