【发布时间】:2011-03-19 06:01:16
【问题描述】:
使用 XSLT,我想知道如何让输出使用我的样式表的名称空间前缀而不是输入文档的前缀。举个例子,给定这个非常简化的文档:
<?xml version="1.0"?>
<a:node xmlns:a="urn:schemas:blah:"/>
以及以下 XSL 转换:
<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:blah="urn:schemas:blah:" version="2.0">
<xsl:output indent="yes">
<xsl:template match="/blah:node">
<xsl:copy/><!-- marked -->
</xsl:template>
</xsl:transform>
我可以说处理器(Saxon8,如果重要的话)识别前缀'blah:'和'a:'的等价性,但是fn:in-scope-prefixes() 例如不显示'blah',只显示'a'。将上面的<!-- marked --> 行更改为:
<node><xsl:value-of select="in-scope-prefixes(.)"/></node>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<node xmlns:blah="urn:schemas:blah:">xml a</node>
如何在事先不知道输入文件调用该前缀“a”的情况下将输入前缀“a”映射到“blah”? (所以<xsl:namespace-alias/> 对我不起作用。)
作为进一步的上下文,如果它指向一个更好的解决方案,这是用于查看外部生成的 XML 文档。外部进程使用自动生成的前缀“a:”、“b:”、“c:”等创建输入文档。我希望能够使用“友好”命名空间前缀显示这些前缀。
解释了 in-scope-prefixes() 行为【问题讨论】:
-
好问题 (+1)。有关完整的 XSLT 1.0 和 XSLT 2.0 解决方案,请参阅我的答案。
标签: xml xslt namespaces prefix