2017-08-07 30 views
0

的概念,如果我的XSL有以下标题,我没有得到任何错误:XML - 试图掌握的命名空间的URI

<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(不提及URNs),只要它在XML/XSL文档中是唯一的。很明显不是。我试图改变URI来测试这个理论。


https://www.w3schools.com/xml/xml_namespaces.asp,我们可以看到下面的语句:

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

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

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

第一条语句意味着我们不关心URI指向的网页是什么,为什么我不能将它设置为指向我想要的任何页面,或者甚至不存在不存在的页面?为什么它必须特别是http://www.w3.org/1999/XSL/Transform

此外,以后在上述链路上我们可以看到:

统一资源标识符(URI)是个字符的字符串,其标识互联网资源

因为这一点,因为“使用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标识),但由于它无法找到它,所以会引发异常。

+0

谢谢你的回复。 如果它甚至不需要从这个URL中提取任何信息,那么它为什么期望URI http://www.w3.org/1999/XSL/Transform标识的名称空间中的样式表元素?我的意思是,Java程序没有这个URL的样式表元素的知识!无论URI如何,样式表都是样式表。 – Flyout

+0

因为样式表不是随机/自定义格式,而是w3标准。 Java已经有了这个标准的模式定义(XSD),因此在准备转换时,它会尝试查看它是否符合期望。 它不知道如何从w3schools中解释样式表,但它知道它可以解析/解释验证到w3.org样式表架构(它由唯一确定的URI ...)的XML文件。 – Fabian

+0

较短的回答:根据样式表的XSD,带有w3schools URI的样式表无效。 – Fabian