如何在xsl中的for reach循环中首先显示特定记录

时间:2017-07-07 11:13:18

标签: xml xslt

我首先要求显示特定的字符串记录,例如,我想首先显示所有 Rehman 记录,然后按顺序显示所有其他记录。

XML

    <?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
  </cd>
  <cd>
    <title>Roja</title>
    <artist>Rehman</artist>
    <country>USA</country>
    <company>RCA</company>
    <price>9.90</price>
    <year>1982</year>
  </cd>
  <cd>
    <title>Still got the blues</title>
    <artist>Gary Moore</artist>
    <country>UK</country>
    <company>Virgin records</company>
    <price>10.20</price>
    <year>1990</year>
  </cd>
  <cd>
    <title>Eros</title>
    <artist>Zack</artist>
    <country>EU</country>
    <company>BMG</company>
    <price>9.90</price>
    <year>1997</year>
  </cd>
  <cd>
    <title>Rockstar</title>
    <artist>Rehman</artist>
    <country>UK</country>
    <company>Polydor</company>
    <price>10.90</price>
    <year>1998</year>
  </cd>
  <cd>
    <title>Sylvias Mother</title>
    <artist>Dr.Hook</artist>
    <country>UK</country>
    <company>CBS</company>
    <price>8.10</price>
    <year>1973</year>
  </cd>

</catalog>

XSL

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

<xsl:template match="/">
  <html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="catalog/cd">
      <xsl:sort select="artist" order ="descending"/>
      <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="artist"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

结果

我的CD收藏

标题艺术家

Empire Burlesque    Bob Dylan
Hide your heart Bonnie Tyler
Sylvias Mother  Dr.Hook
Still got the blues Gary Moore
Roja    Rehman
Rockstar    Rehman
Eros    Zack

2 个答案:

答案 0 :(得分:0)

您可以使用此

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

    <xsl:template match="/">
        <html>
            <body>
                <h2>My CD Collection</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Title</th>
                        <th>Artist</th>
                    </tr>
                    <xsl:for-each select="catalog/cd[artist='Rehman']">
                        <xsl:sort select="artist" order ="descending"/>
                        <tr>
                            <td><xsl:value-of select="title"/></td>
                            <td><xsl:value-of select="artist"/></td>
                        </tr>
                    </xsl:for-each>
                    <xsl:for-each select="catalog/cd[artist!='Rehman']">
                       <!-- You can use this for sorting of rest -->
                       <!-- <xsl:sort select="artist" order ="descending"/> -->
                        <tr>
                            <td><xsl:value-of select="title"/></td>
                            <td><xsl:value-of select="artist"/></td>
                        </tr>
                    </xsl:for-each>

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

</xsl:stylesheet>

答案 1 :(得分:0)

你似乎已经拥有了你需要的大部分作品;这只是一个以有效方式组装它们的问题。特别是,您可以通过精心选择的xsl:sort密钥来完成此操作。

您希望将带有艺术家Rehman的CD输出到所有其他CD之前,所以让我们从XPath表达式开始,该表达式在使用<cd>元素作为当前节点进行评估时表达该条件:

artist = 'Rehman'

排序键可以是任何XPath表达式;它的值将被转换为一个字符串(之后可能会被重新解释为一个数字)。上面的表达式计算为布尔值,并在转换为将导致'true''false'的字符串时。由于'true''false'之后按字典顺序排列,并且您希望首先输出表达式为true的CD,因此您需要为该键指定降序:

      <xsl:for-each select="catalog/cd">
      <xsl:sort select="artist = 'Rehman'" order="descending"/>
      <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="artist"/></td>
      </tr>
      </xsl:for-each>

如果您想进一步细化订单,例如要按艺术家的字母顺序显示剩余的记录,然后您可以添加任意数量的其他排序键;应用于相同范围的多个键根据它们出现的顺序从最大到最小归属。