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

Saxon exclude-result-prefixes dropping namespace for attribute values

我在使用 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>

实际上会从结果 XML 中删除 xmlns:xs="http://www.w3.org/2001/XMLSchema" 声明,因为 exclude-result-prefixes= “#all”。显然发生这种情况是因为它用于属性值而不是元素或属性。

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

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

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

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

Namespace fixup is not used to create namespace declarations for xs:QName or xs:NOTATION values appearing in the content of an element or attribute.

Where values acquire such types as the result of validation, namespace fixup does not come into play, because namespace fixup happens before validation: in this situation, it is the user's responsibility to ensure that the element being validated has the required namespace nodes to enable validation to succeed.

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