Как можно динамически генерировать динамические XML-атрибуты XSLT? Например, мы можем иметь следующий XML-документ, используя различные атрибуты, такие как attr1:foo
или attr2:bar
:Как сгенерировать динамический XML-атрибут динамически в XSLT?
<a xmlns="http://example.com/"
xmlns:attr1="http://example.com/attr1#"
xmlns:attr2="http://example.com/attr2#">
<b attr1:foo=""/>
<b attr2:bar=""/>
</a>
Предположим, мы хотим преобразовать документ и изменить значения всех атрибутов ...
. Как мы должны строить эти атрибуты? Естественным вариантом, как это сделать, было бы использовать <xsl:attribute>
. Но какое QName следует использовать в качестве атрибута name
? Функция name()
может вернуть QName атрибута в виде строки. Наивный шаблон XSL может выглядеть следующим образом:
<xsl:template match="@*">
<xsl:attribute name="{name()}">...</xsl:attribute>
</xsl:template>
Однако, поскольку name()
возвращает QName как строка, это решение требует через xmlns
, что предопределено префикс пространства имен привязки в XSLT (например, xmlns:attr1="http://example.com/attr1#"
).
Тогда мне было интересно, если с помощью атрибута <xsl:attribute>
namespace
является путь:
<xsl:template match="@*">
<xsl:attribute name="{local-name()}"
namespace="{namespace-uri()}">...</xsl:attribute>
</xsl:template>
Это решение, кажется, работает, но я думаю, что вряд ли лучшая практика в XSLT. Вы знаете лучшее решение?
Я заранее не знаю привязки префикса пространства имен. Вот почему я хочу динамически создавать динамические имена. –
Тогда я не знаю лучшего решения, чем ваш второй шаблон. Почему вы думаете, что это не лучшая практика? –
ОК, я просто не был уверен, что это идиоматический XSLT. Я думал, что есть более простой способ сделать это. –