У меня есть простой XSL, который использует импорт:динамического пространства имен выход для импортированных шаблонов
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns="http://ex1">
<xsl:import href="import.xsl" />
<xsl:template match="/">
<ROOT>
<FIRST />
<xsl:apply-templates />
</ROOT>
</xsl:template>
</xsl:stylesheet>
Импортированная таблица стилей:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="elm">
<ELM/>
</xsl:template>
</xsl:stylesheet>
Теперь я хочу, что импортируемые шаблоны также использовать пространство имен по умолчанию http://ex1
, как определено в основной таблице стилей. Я ожидал, что:
<ROOT xmlns="http://ex1">
<FIRST/>
<ELM/>
</ROOT>
Но я получил:
<ROOT xmlns="http://ex1">
<FIRST/>
<ELM xmlns=""/>
</ROOT>
Импортированная таблица стилей необходимо выводить на namespacee, что основной шаблон определяет.
То, что я пытался
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns="http://ex1">
<xsl:import href="import_nsparam.xsl" />
<xsl:template match="/">
<ROOT>
<FIRST />
<xsl:apply-templates>
<xsl:with-param name="ns">http://ex1</xsl:with-param>
</xsl:apply-templates>
</ROOT>
</xsl:template>
</xsl:stylesheet>
С помощью этого импорта:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="elm">
<xsl:param name="ns"/>
<xsl:element name="ELM" namespace="{$ns}"/>
</xsl:template>
</xsl:stylesheet>
Это работает, но это требует много biolerplate кода.
Есть ли лучший способ сделать это?