2015-01-15 2 views
1

Как можно динамически генерировать динамические 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. Вы знаете лучшее решение?

ответ

2

Это зависит от того, что вы знаете о структуре исходного документа:

  • Если вы знаете пространство имен, используемые и их префиксы привязки, то объявить их в таблице стилей и использовать то, что вы назвали «наивным XSL шаблон ".

  • В противном случае скопируйте пространство имен (URI), как показано в вашем втором шаблоне.


Заметим также, что вы можете объединить два следующим образом:

<xsl:template match="@*"> 
    <xsl:attribute name="{name()}" namespace="{namespace-uri()}">...</xsl:attribute> 
</xsl:template> 

С некоторыми процессорами (например, саксонских 6,5), это будет гарантировать, что исходные префиксы повторно используемых в результате ; другие процессоры (например, libxslt и Xalan) будут делать это в любом случае.

+0

Я заранее не знаю привязки префикса пространства имен. Вот почему я хочу динамически создавать динамические имена. –

+0

Тогда я не знаю лучшего решения, чем ваш второй шаблон. Почему вы думаете, что это не лучшая практика? –

+0

ОК, я просто не был уверен, что это идиоматический XSLT. Я думал, что есть более простой способ сделать это. –

Смежные вопросы