Нужна помощь для xsl: template - PullRequest
       0

Нужна помощь для xsl: template

0 голосов
/ 05 декабря 2011


У меня есть это в моем XML

<GROUP>
    <ELEM_1/>
    <ELEM_1/>
    <ELEM_1/>
    <ELEM_1/>
</GROUP>
<GROUP>
    <TAB>
        <LEFT>
            <ELEM_1/>
            <ELEM_1/>
            <ELEM_2/>
        </LEFT>
        <RIGHT>
            <ELEM_1/>
            <ELEM_2/>
            <ELEM_2/>
            <ELEM_1/>
        </RIGHT>
    </TAB>
</GROUP>
<GROUP>
    <ELEM_1/>
    <ELEM_1/>
    <ELEM_1/>
    <ELEM_1/>
</GROUP>

У меня есть и xsl, которые преобразуют этот XML для отображения. Я хочу, чтобы TAB узла отображался как таблица с двумя столбцами LEFT и RIGHT и по одной строке, каждая из которых отображала список с ELEM_1 и ELEM_2. У меня есть xsl:template как отображать ELEM_1 и ELEM_2, как я хочу.

У меня есть xsl:template для вкладки, которая делает то, что я хочу

<xsl:template match="TAB">
    <table>
        <tr>
            <td><xsl:apply-templates select="LEFT"/></td>
            <td><xsl:apply-templates select="RIGHT"/></td>
        </tr>
    </table>
</xsl:template>

Но xsl:template для ПРАВО и ВЛЕВО не работает так, как я хочу

<xsl:template match="LEFT">
    <ul class="Group">
        <li class="TabTitle">Left title</li>
        <xsl:if test="ELEM_1">
            <xsl:apply-templates select="ELEM_1"/>
        </xsl:if>
        <xsl:if test="ELEM_2">
            <xsl:apply-templates select="ELEM_2"/>
        </xsl:if>
    </ul>
</xsl:template>

<xsl:template match="RIGHT">
    <ul class="Group">
        <li class="TabTitle">Right title</li>
            <xsl:if test="ELEM_1">
                <xsl:apply-templates select="ELEM_1"/>
            </xsl:if>
            <xsl:if test="ELEM_2">
                <xsl:apply-templates select="ELEM_2"/>
            </xsl:if>
    </ul>
</xsl:template>

Как это сделать правильно? Спасибо

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Я не уверен, на каком примере вы собираетесь достичь результата (вероятно, перечислите узлы ELEM_1, ELEM_2):

<xsl:template match="TAB">
    <table>
        <tr>
            <td><xsl:apply-templates select="LEFT"/></td>
            <td><xsl:apply-templates select="RIGHT"/></td>
        </tr>
    </table>
</xsl:template>

<xsl:template match="LEFT">
  <ul class="Group">
    <li class="TabTitle">Left title</li>

    <xsl:apply-templates />

  </ul>
</xsl:template>

<xsl:template match="RIGHT">
  <ul class="Group">
    <li class="TabTitle">Right title</li>

    <xsl:apply-templates />  
  </ul>
</xsl:template>

<xsl:template match="LEFT/* | RIGHT/*">
    <!--Do something - copy Elem_1, Elem_2 element nodes for example -->
    <xsl:copy/>
</xsl:template>
0 голосов
/ 05 декабря 2011

Я не уверен, почему ваши тесты не проходят.В приведенном ниже решении вам не нужно тестировать, так как XSLT - это декларативный язык.Вот, пожалуйста:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:php="http://php.net/xsl">

<xsl:template match="/">
    <xsl:apply-templates select="/ROOT/GROUP/TAB" />
</xsl:template>

<xsl:template match="TAB">
    <table>
        <tr>
            <xsl:apply-templates select="LEFT | RIGHT "/>
        </tr>
    </table>
</xsl:template>

<xsl:template match="LEFT">
    <td>
     <ul class="Group">
            <li class="TabTitle">Left title</li>
                <xsl:apply-templates select="ELEM_1"/>
                <xsl:apply-templates select="ELEM_2"/>
       </ul>
   </td>
</xsl:template>

<xsl:template match="RIGHT">
    <td>
         <ul class="Group">
                <li class="TabTitle">Right title</li>
                    <xsl:apply-templates select="ELEM_1"/>
                    <xsl:apply-templates select="ELEM_2"/>
        </ul>
    </td>
</xsl:template>

<!-- your elm templates -->
<xsl:template match="ELEM_1">
    <p>ELEM 1 OUTPUT</p>
</xsl:template>
<xsl:template match="ELEM_2">
    <p>ELEM 2 OUTPUT</p>
</xsl:template>


</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...