xslt apply-templates на втором уровне - PullRequest
0 голосов
/ 14 июня 2010

Я не могу обернуть теги <panel> в отдельные элементы второго уровня, как показано в ожидаемом результате ниже Вместо этого я получаю все значения элемента 1.x в один узел с xslt, который я написал ниже. Пожалуйста, помогите мне.

Источник xml

    <root>
    <step id="1">
        <content>
            <text>
                1.0 Sample first level step text
            </text>
        </content>
        <content/>
        <step>
            <content>
                <text>
                    1.1 Sample second level step text
                </text>
            </content>
        </step>
        <step>
            <content>
                <text>
                    1.2 Sample second level step text
                </text>
            </content>
        </step>
        <step>
            <content>
                <text>
                    1.3 Sample second level step text
                </text>
            </content>
        </step>
    </step>
    <step id="2">
        <content>
            <text>
                2.0 Sample first level step text
            </text>
        </content>
        <content/>
        <step>
            <content>
                <text>
                    2.1 Sample second level step text
                </text>
            </content>
        </step>
        <step>
            <content>
                <text>
                    2.2 Sample second level step text
                </text>
            </content>
        </step>
        <step>
            <content>
                <text>
                    2.3 Sample second level step text
                </text>
            </content>
        </step>
    </step>
</root>

Ожидаемый результат

<panel>
    <panel>
        <panel>
            1.0 Sample first level step text
        </panel>
        <panel>
            1.1 Sample second level step text
        </panel>
        <panel>
            1.2 Sample second level step text
        </panel>
        <panel>
            1.3 Sample second level step text
        </panel>
    </panel>
    <panel>
        <panel>
            2.0 Sample first level step text
        </panel>
        <panel>
            2.1 Sample second level step text
        </panel>
        <panel>
            2.2 Sample second level step text
        </panel>
        <panel>
            2.3 Sample second level step text
        </panel>
    </panel>
</panel>

Мой XSLT

<xsl:template match="/">
    <panel>
        <xsl:apply-templates/>
    </panel>
</xsl:template>

<xsl:template match="root/step" >
    <panel>
        <panel>
            <xsl:apply-templates select ="content/text/node()"></xsl:apply-templates>
        </panel>
        <panel>
            <xsl:apply-templates select ="step/content/text/node()"></xsl:apply-templates>
        </panel>
    </panel>
</xsl:template>

Ответы [ 2 ]

4 голосов
/ 14 июня 2010

Это должно работать:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 

 <xsl:template match="root|root/step|text"> 
   <panel> 
    <xsl:apply-templates/> 
   </panel> 
 </xsl:template> 

</xsl:stylesheet> 

Редактировать : Если вы хотите немного украсить вещи, добавьте этот шаблон:

 <xsl:template match="text()"> 
   <xsl:value-of select="normalize-space()"/> 
 </xsl:template> 

Редактировать 2 : Я изменил шаблон в соответствии с новым документом ввода и вывода. Это в случае любой другой раны может понадобиться.

0 голосов
/ 14 июня 2010

Хитрость в использовании // accessor

<xsl:template match="/">
    <panel>
        <xsl:apply-templates select='//text'/>
    </panel>
</xsl:template>

<xsl:template match="text" >
        <panel>
            <xsl:apply-templates select ="./node()"></xsl:apply-templates>
        </panel>
</xsl:template>

поместите ожидаемое форматирование вместо моего node()

EDITED Для обработки группировки, как вы просите, добавьте еще

<xsl:template match="/">
    <panel>
        <xsl:apply-templates select='/root/step' mode="root"/>
    </panel>
</xsl:template>
<xsl:template match="step" mode="root"><!-- mode allows distinguish another tag 'step'-->
     <panel> <!-- now we can convert tree to planar -->
         <xsl:apply-templates select='//text'/>
     </panel>    
</xsl:template>

<xsl:template match="text" >
        <panel>
            <!-- format text from node text there -->
            <xsl:apply-templates select ="text()"></xsl:apply-templates>
        </panel>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...