我对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?
这样众所周知的属性是否存在特殊行为?答案 0 :(得分:2)
我没有看到http://www.w3.org/TR/xslt20/#namespace-fixup要求处理器检查类型名称的属性值,如下所示:
命名空间fixup不用于为其创建名称空间声明 xs:QName或xs:出现在元素内容中的NOTATION值 或属性。
其中值获取验证结果,命名空间等类型 fixup没有发挥作用,因为命名空间修复之前发生过 验证:在这种情况下,用户负责 确保要验证的元素具有所需的命名空间 节点使验证成功。
基于此我会说样式表作者有责任确保xs
前缀绑定到URI http://www.w3.org/2001/XMLSchema
。