Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Вывод данных из нескольких xsl


Автор: mcTep 30.7.2009, 16:15
Доброго времени суток.

Есть такая задача:

В главном xsl подключается множество других мелких xsl, количество которых неограниченно. Нужно вывести информацию из каждого мелкого xsl, заключенного в определенном шаблоне шаблоне.
Есть такой пример:

main.xml:
Код

<?xml version="1.0" encoding="UTF-8"?>
<root>
    Bad Hello!! :-(
    <element>
        Very Bad Hello!! :-((
    </element>
</root>


main.xsl:
Код

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:str="http://example.com/namespace"
    version="2.0" exclude-result-prefixes="str">
    
    <xsl:import href="first.xsl"/>
    <xsl:import href="second.xsl"/>
    
    <xsl:output method="text"/>
    
    <xsl:template match="/">
        <xsl:apply-templates select="." mode="hello"/>
    </xsl:template>
    
    <xsl:template match="/" mode="hello">
        <xsl:text>Main Hello!
</xsl:text>
        <xsl:next-match/>
    </xsl:template>
</xsl:transform>


first.xsl:
Код

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:str="http://example.com/namespace"
    version="2.0" exclude-result-prefixes="str">
    <xsl:output method="text"/>
    
    <xsl:template match="/" mode="hello">
        <xsl:text>First Hello!
</xsl:text>
        <xsl:next-match/>
    </xsl:template>
</xsl:transform>


second.xsl:
Код

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:str="http://example.com/namespace"
    version="2.0" exclude-result-prefixes="str">
    <xsl:output method="text"/>
    
    <xsl:template match="/" mode="hello">
        <xsl:text>Second Hello!
</xsl:text>
        <xsl:next-match/>
    </xsl:template>
</xsl:transform>


После прогона через Saxon9 (java net.sf.saxon.Transform -s:main.xml -xsl:main.xsl -o:main.txt) выводится следующее
Код

Main Hello!
Second Hello!
First Hello!

    Bad Hello!! :-(
    
        Very Bad Hello!! :-((



Как я понял, при использовании <xsl:next-match/> преобразование переходит на следующий похожий шаблон и после последнего шаблона с mode="hello" он просто выплевывает текстовое содержимое узлов, чего не очень хочется. 
Вопрос: Как этого избежать?

Может кто сталкивался с данной проблемой и решил ее или же имеет другое решение.. Заранее спасибо =)

Автор: mcTep 10.8.2009, 18:28
Решил проблему, путем переопределения в main.xsl пустого шаблона с mode="hello" для всех элементов.
Код

<xsl:template match="*" mode="hello"/>


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)