Используя 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 () , например, не не показывать «бла», только «а». Изменение строки <!-- 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>
Как можно сопоставить префикс ввода «а» с «бла», не зная заранее, что входной файл вызывает этот префикс «а»? (Так что <xsl:namespace-alias/>
не будет работать для меня.)
В качестве дальнейшего контекста, если он указывает на лучшее решение, это для просмотра документов XML, которые генерируются извне. Внешний процесс создает входной документ, используя автоматически сгенерированные префиксы «a:», «b:», «c:» и т. Д. Я хочу иметь возможность отображать эти префиксы с использованием префиксов пространства имен «Friendlier».
Обновление : поведение in-scope-prefixes () объясняется определением статически известных пространств имен