如何在XSL中添加其他表

时间:2014-05-14 20:00:09

标签: html xml xslt

我试图在我的文档中创建多个表。这是当前使用的XSLT代码:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
    <h2 align="center">UFC Fighter Roster</h2>
<table border="0" align="left" width="20%" >
  <th>Heavyweight</th>
      <tr bgcolor="#9acd32">
        <th>Name</th>
        <th>Rank</th>
      </tr>
    <xsl:for-each select="roster/cd">
    <xsl:if test="weight=180">
      <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="rank"/></td>
      </tr>
</table>


    </xsl:if>
    </xsl:for-each>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

我使用这张桌子以重量= 180拉动战斗机,如果我想在同一页面上生成一张桌子,代表重量= 170的战士,我该如何去做,因为每次我尝试使用相同的代码,但不同的重量数字,它不起作用?

以下是我正在使用的XML版本。

<?xml version="1.0" encoding="UTF-8"?>

<roster>
    <cd>
        <title>Cain Velasquez</title>
        <rank>1st</rank>
        <weight>180</weight>
    </cd>
    <cd>
        <title>Fabricio Werdum</title>
        <rank>2nd</rank>
        <weight>180</weight>

    </cd>
    <cd>
        <title>Junior Dos Santos</title>
        <rank>3rd</rank>
        <weight>180</weight>
    </cd>
    <cd>
        <title>Travis Browne</title>
        <rank>4th</rank>
        <weight>180</weight>

    </cd>
    <cd>
        <title>Antonio Silva</title>
        <rank>5th</rank>
        <weight>180</weight>

    </cd>
    <cd>
        <title>Jon Jones</title>
        <rank>1st</rank>
        <weight>170</weight>
    </cd>
    <cd>
        <title>Alexander Guftasson</title>
        <rank>2nd</rank>
        <weight>170</weight>

    </cd>
    <cd>
        <title>Rashad Evans</title>
        <rank>3rd</rank>
        <weight>170</weight>

    </cd>
    <cd>
        <title>Glover Teixiera</title>
        <rank>4th</rank>
        <weight>170</weight>
    </cd>
    <cd>
        <title>Shogun Rua</title>
        <rank>5th</rank>
        <weight>170</weight>
    </cd>

</catalog>

3 个答案:

答案 0 :(得分:1)

  

如果我愿意的话,我正在使用这张桌子来拉动重量= 180的战士   在同一页面上制作一张表格,表示战士的表格   重量= 170我该怎么做呢

您应该使用,而不是尝试使用xsl:if执行此操作。


修改

例如:

XSLT 1.0

xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="cd-by-weight" match="cd" use="weight" />

<xsl:template match="/">
    <html>
        <table>
            <tr>
                <th>Heavyweight</th>
            </tr>
            <tr>
                <th>Name</th>
                <th>Rank</th>
            </tr>
            <xsl:for-each select="key('cd-by-weight', 180)">
                <tr>
                    <td><xsl:value-of select="title"/></td>
                    <td><xsl:value-of select="rank"/></td>
                </tr>
            </xsl:for-each>
        </table>
        <br/>
        <table>
            <tr>
                <th>Less Heavyweight</th>
            </tr>
            <tr>
                <th>Name</th>
                <th>Rank</th>
            </tr>
            <xsl:for-each select="key('cd-by-weight', 170)">
                <tr>
                    <td><xsl:value-of select="title"/></td>
                    <td><xsl:value-of select="rank"/></td>
                </tr>
            </xsl:for-each>
        </table>
    </html>
</xsl:template>

</xsl:stylesheet>

这假设源文档始终包含两个权重的战斗机。请注意,可以通过调用以权重作为参数的命名模板来消除代码重复。

答案 1 :(得分:0)

检查XSLT 1.0 Group By

在XSL 2.0中

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h2 align="center">UFC Fighter Roster</h2>

                <xsl:for-each-group select="roster/cd" group-by="weight">
                   <table border="0" align="left" width="20%" >
                        <th>Heavyweight</th>
                        <tr bgcolor="#9acd32">
                            <th>Name</th>
                            <th>Rank</th>
                        </tr>
                       <xsl:for-each select="current-group()">
                        <tr>
                                    <td><xsl:value-of select="title/node()"/></td>
                                    <td><xsl:value-of select="rank/node()"/></td>
                         </tr>
                          </xsl:for-each>
                    </table>  
                </xsl:for-each-group>


            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

如果您希望它是模块化的,您可以按照以下步骤进行操作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <html>
        <body>
            <h2 align="center">UFC Fighter Roster</h2>
            <xsl:call-template name="table">
                <xsl:with-param name="title">Heavyweight</xsl:with-param>
                <xsl:with-param name="w" select="180"/>
            </xsl:call-template>
            <xsl:call-template name="table">
                <xsl:with-param name="title">weight (170)</xsl:with-param>
                <xsl:with-param name="w" select="170"/>
            </xsl:call-template>
        </body>
    </html>
</xsl:template>

<xsl:template name="table">
    <xsl:param name="w"/>
    <xsl:param name="title"/>
    <table border="0" align="left" width="20%" >
        <th><xsl:value-of select="$title"/></th>
        <tr bgcolor="#9acd32">
            <th>Name</th>
            <th>Rank</th>
        </tr>
        <xsl:apply-templates select="/catalog/cd[weight=$w]"/>
    </table>
</xsl:template>

<xsl:template match="cd">
    <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="rank"/></td>
    </tr>
</xsl:template>
</xsl:stylesheet>

对于XSLT2.0分组是一个很好的选择,如果你想要特定的值,那么使用current-group-key():

<xsl:for-each select="current-group()[current-grouping-key() = ('170','180')]">
  <tr>
    <td><xsl:value-of select="title/node()"/></td>
    <td><xsl:value-of select="rank/node()"/></td>
  </tr>
</xsl:for-each>

希望它会有所帮助 问候,