如何使用XPATH选择性地将项目放在2个表中(XSLT模板)

时间:2015-10-24 19:39:33

标签: xml xslt xpath

我目前陷入了这个家庭作业问题。

我必须在2005年之前创建2个带电影的表格,然后创建带有电影2005年及以后的辅助表格。在我的代码中,我创建了两个表并用信息填充它们。但我无法弄清楚如何制作一个条件陈述,将2005年的电影放在一张桌子上,并在2005年之前在第二张桌子上移动。我不确定是否需要为两个表模板创建条件语句,或者可以使用一个符合两个表条件的条件语句来完成。

请参阅下面的代码。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>Movies</title>
        <style type="text/css">
          .myTable
          {
          border-collapse: collapse;
          border-spacing: 5px;
          }

          .myTable td, th
          {
          border: 1px solid #000;
          padding: 5px;
          }
          .myTable2
          {
          border-collapse: collapse;
          border-spacing: 5px;
          }

          .myTable2 td, th
          {
          border: 1px solid #000;
          padding: 5px;
          }
        </style>
      </head>
      <body>
        <h3>Movies Until 2005</h3>
        <table class="myTable">
          <tr bgcolor="#9acd32">
            <th>ID</th>
            <th>Title</th>
            <th>Director</th>
            <th>Year</th>
            <th>Genres</th>
          </tr>

          <xsl:variable name="counter" select="count(movies/movie/id)"/>

          <xsl:apply-templates select="movies/movie">
            <xsl:sort select="title"/>
          </xsl:apply-templates>

          <tfoot>
            <tr>
              <td>
                Number of movies: <xsl:value-of select="$counter"/>
              </td>
            </tr>
          </tfoot>

        </table>
        <br/>

        <h3>Movies 2005 Onwards</h3>
        <table class="myTable2">
          <tr bgcolor="#9acd32">
            <th>ID</th>
            <th>Title</th>
            <th>Director</th>
            <th>Year</th>
            <th>Genres</th>
          </tr>

          <xsl:variable name="counter" select="count(movies/movie/id)"/>

          <xsl:apply-templates select="movies/movie">
            <xsl:sort select="title"/>
          </xsl:apply-templates>

          <tfoot>
            <tr>
              <td>
                Number of movies: <xsl:value-of select="$counter"/>
              </td>
            </tr>
          </tfoot>

        </table>
        <br/>

        <h1>Directors</h1>
        <xsl:for-each select="movies/movie">
          <xsl:sort select="principalDirector"/>
          <ul>
            <li>
              <xsl:value-of select="principalDirector"/>
            </li>
          </ul>
        </xsl:for-each>

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

  <xsl:template match ="movie">
    <xsl:variable name="hyperlink">
      <xsl:value-of select="url" />
    </xsl:variable>
    <tr>
      <td>
        <xsl:value-of select="id"/>
      </td>
      <td>
        <xsl:choose>
          <xsl:when test="url">
            <a href="{$hyperlink}" target="_blank">
              <xsl:value-of select="title" />
            </a>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="title" />
          </xsl:otherwise>
        </xsl:choose>
      </td>
      <td>
        <xsl:value-of select="principalDirector"/>
      </td>
      <td>
        <xsl:value-of select="year"/>
      </td>
      <td>
          <xsl:for-each select="genre">
            <xsl:value-of select=
         "concat(., substring(', ', 2 - (position() != last())))"
         />
          </xsl:for-each>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

这是XML代码

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="Movies.xslt"?>

<movies>
  <movie>
    <id>1000001</id>
    <title>The Avengers</title>
    <principalDirector>Joss Whedon</principalDirector>
    <year>2012</year>
    <genre>Action</genre>
    <genre>Adventure</genre>
    <genre>Sci-Fi</genre>
    <url>http://www.imdb.com/title/tt0848228/?ref_=nv_sr_1</url>
  </movie>
  <movie>
    <id>1000002</id>
    <title>Avatar</title>
    <principalDirector>James Cameron</principalDirector>
    <year>2009</year>
    <genre>Action</genre>
    <genre>Adventure</genre>
    <genre>Fantasy</genre>
    <url>http://www.imdb.com/title/tt0499549/?ref_=fn_al_tt_1</url>
  </movie>
  <movie>
    <id>1000003</id>
    <title>Inception</title>
    <principalDirector>Christopher Nolan</principalDirector>
    <year>2010</year>
    <genre>Action</genre>
    <genre>Mystery</genre>
    <genre>Sci-Fi</genre>
    <url>http://www.imdb.com/title/tt1375666/?ref_=tt_rec_tti</url>
  </movie>
  <movie>
    <id>1000004</id>
    <title>Gladiator</title>
    <principalDirector>Ridley Scott</principalDirector>
    <year>2000</year>
    <genre>Action</genre>
    <genre>Drama</genre>
    <url>http://www.imdb.com/title/tt0172495/?ref_=nv_sr_1</url>
  </movie> 

1 个答案:

答案 0 :(得分:0)

  

我无法弄清楚如何制作一个放置的条件语句   2005年的电影在一张桌子上,并在2005年之前移动   第二张桌子。我不确定是否需要创建条件语句   对于两个表模板,或者可以使用一个条件   与两个表的条​​件匹配的语句。

实际上不需要任何条件语句 - 只需使用谓词即可。试试这个作为指南:

XSLT 1.0

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

<xsl:variable name="thead">
    <tr>
        <th>ID</th>
        <th>Title</th>
        <th>Director</th>
        <th>Year</th>
        <th>Genres</th>
    </tr>
</xsl:variable>

<xsl:template match="/movies">
    <xsl:variable name="movies-before" select="movie[year &lt; 2005]" />
    <xsl:variable name="movies-after" select="movie[year >= 2005]" />
    <html>
        <head>
            <title>Movies</title>
        </head>
        <body>
            <h3>Movies Until 2005</h3>
            <table>
                <xsl:copy-of select="$thead"/>
                <xsl:apply-templates select="$movies-before">
                    <xsl:sort select="title"/>
                </xsl:apply-templates>
                <tfoot>
                    <tr>
                        <td>Number of movies: <xsl:value-of select="count($movies-before)"/></td>
                    </tr>
                </tfoot>
            </table>
            <br/>
            <h3>Movies 2005 Onwards</h3>
            <table>
                <xsl:copy-of select="$thead"/>
                <xsl:apply-templates select="$movies-after">
                    <xsl:sort select="title"/>
                </xsl:apply-templates>
                <tfoot>
                    <tr>
                        <td>Number of movies: <xsl:value-of select="count($movies-after)"/></td>
                    </tr>
                </tfoot>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="movie">
    <tr>
        <td>
            <xsl:value-of select="id"/>
        </td>
        <td>
            <xsl:value-of select="title"/>
        </td>
        <td>
            <xsl:value-of select="principalDirector"/>
        </td>
        <td>
            <xsl:value-of select="year"/>
        </td>
        <td>
            <xsl:for-each select="genre">
                <xsl:value-of select="."/>
                <xsl:if test="position() != last()">
                    <xsl:text>, </xsl:text>
                </xsl:if>
            </xsl:for-each>
        </td>
    </tr>
</xsl:template>

</xsl:stylesheet>