2016-01-18 9 views
1

У меня есть простой 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 кода.

Есть ли лучший способ сделать это?

ответ

1

Вы можете попробовать <xsl:with-param name="ns" select="namespace-uri-for-prefix('', document('')/*)"/> вместо <xsl:with-param name="ns">http://ex1</xsl:with-param>, чтобы не требовалось жестко кодировать пространство имен дважды в таблице стилей.