Saxon exclude-result-prefixes为属性值删除命名空间

时间:2015-02-27 09:21:31

标签: xml xslt saxon

我对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>

由于 exclude-result-prefixes =“,实际上会从生成的XML中删除 xmlns:xs =”http://www.w3.org/2001/XMLSchema“声明#ALL“即可。显然,这是因为它在属性值中使用,而不是在元素或属性中使用。

删除exclude-result-prefixes =“#all”或手动指定要删除的前缀有效。

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

对于像xsi:type?

这样众所周知的属性是否存在特殊行为?

1 个答案:

答案 0 :(得分:2)

我没有看到http://www.w3.org/TR/xslt20/#namespace-fixup要求处理器检查类型名称的属性值,如下所示:

  

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

     

其中值获取验证结果,命名空间等类型   fixup没有发挥作用,因为命名空间修复之前发生过   验证:在这种情况下,用户负责   确保要验证的元素具有所需的命名空间   节点使验证成功。

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