需要帮助xsl:template

时间:2011-12-05 16:38:31

标签: xml xslt


我在我的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用于做我想做的TAB

<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 :(得分:0)

我不确定为什么你的测试失败了。在下面的解决方案中,无论如何都不需要测试,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>

答案 1 :(得分:0)

我不确定您要实现的结果示例(可能枚举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>