当前位置: 首页 > 知识库问答 >
问题:

Saxon排除结果前缀,删除属性值的命名空间

云建木
2023-03-14

我对Saxon的XSLT处理器有一个奇怪的问题(最新版本=9.?)

给定这个伪造的XML(不管它是什么):

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:bogus">bogus</root>

使用此XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<x:transform version="2.0"
  xmlns:x="http://www.w3.org/1999/XSL/Transform" 
  xmlns:b="urn:bogus"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="urn:foobar"
  xpath-default-namespace="urn:foobar"
  exclude-result-prefixes="#all">

 <x:output method="xml" indent="yes" encoding="UTF-8" />   

  <x:template match="b:root">
    <foo xsi:type="xs:string"><x:value-of select="."/></foo>
  </x:template>

</x:transform>

将实际删除xmlns:xs=”http://www.w3.org/2001/XMLSchema“来自结果XML的声明,因为排除结果前缀=#all”。显然,发生这种情况是因为它在属性值中使用,而不是在元素或属性中使用。

删除排除结果前缀="#all"或手动指定要删除的前缀确实有效。

这是预期的行为吗?我猜处理器将所有属性值视为随机字符串,并且没有考虑它们的命名空间(它甚至没有注意到它有一个我假设的)。

像xsi:type这样的众所周知的属性应该有特殊的行为吗?

共有1个答案

南宫天逸
2023-03-14

我不认为http://www.w3.org/TR/xslt20/#namespace-fixup要求处理器检查类型名称的属性值,因为它说:

命名空间修复不用于为元素或属性内容中出现的xs:QName或xs:NOTATION值创建命名空间声明

当值获得验证结果等类型时,命名空间修正不会起作用,因为命名空间修正发生在验证之前:在这种情况下,用户有责任确保被验证的元素具有所需的命名空间节点,以使验证成功。

基于此,我想说样式表作者有责任确保xs前缀绑定到URIhttp://www.w3.org/2001/XMLSchema。

 类似资料:
  • 2)如果我按照下面的方式编辑package-info,那么它是很好的,但是问题是我创建的是一个JAXB整数元素如下所示,前缀删除没有应用于这些元素

  • 这是我的输入xml

  • 问题内容: 我喜欢ElementTree解析xml的方式,特别是Xpath功能。我从带有嵌套标签的应用程序以xml输出。 我想按名称访问此标签,而不指定名称空间,这可能吗?例如: 代替: 问题答案: 至少使用lxml2,可以稍微减少此开销:

  • 如何更改pandas数据框的列标签: 到

  • 问题内容: 我有一个使用默认名称空间打印的文件。元素以ns2前缀打印,我需要将其删除,以及与我的代码的关系: 我希望它是: 这就是我的编码方式,据我所知,这足以使ns2消失: 生成的package-info结果如下: 我创建如下文件: generateClassesPackage是其中package-info.java及其元素所在的包。 Foo对象已定义,并具有以下元素: 我错过了吗?还是我误解了

  • 我有从一个模式创建的JAXB对象。在封送过程中,使用NS2对xml元素进行注释。对于这个问题,我已经尝试了网络上存在的所有选项,但没有一个可行。我不能修改我的模式或更改package-info.java。请帮忙