Xslt模板。 xsl如果不工作

时间:2017-10-30 01:13:27

标签: xml xslt xslt-2.0

我正在尝试创建两个表,一个表示更大,一个表示何时更少。第一个表工作正常但是创建第二个表不起作用。

<?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"/>
  <!-- template that is use for root-->
  <xsl:template match="/">

    <html>
      <!--Displays a heading above the list of movie title-->
      <head>
        <title> Movies</title>
      </head>
      <body>
        <!--Displays a heading above the list of movie title-->
        <h1 align="center">
          <font color="red" size="10">Movies  Listing</font>
        </h1>
        <!-- Creates the table-->
        <table style="color:blue;" bgcolor="gray" cellpadding="5" border="1" align="center">
          <tr style="font-family:arial; color:blue;">
            <td>Movie ID</td>
            <td>Title</td>
            <td>Director</td>
            <td> Movie Year</td>
          </tr>
          <!-- apply template stament to use the template for movie-->
          <xsl:apply-templates select="movies/movie">
            <xsl:sort select="title" order="ascending"></xsl:sort>
          </xsl:apply-templates>
        </table>

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

  <!-- template for each movie element-->

  <xsl:template match="movie">
    <xsl:if test="year&lt;2005">
    <tr>
      <td>
        <xsl:apply-templates select="@id"/>
      </td>
      <td>
        <xsl:apply-templates select="title"/>
      </td>
      <td>
        <xsl:apply-templates select="Director"/>
      </td>
      <td>
        <xsl:apply-templates select="year"/>
      </td>
    </tr>
    </xsl:if>
    <xsl:apply-templates select="year">
  </xsl:template>


  <xsl:template match="year">
    <table>
      <tr style="font-family:arial; color:blue;">
        <td>Movie ID</td>
        <td>Title</td>
        <td>Director</td>
        <td> Movie Year</td>
      </tr>
      <xsl:if test="year&gt;=2005">
        <tr>
          <td>
            <xsl:apply-templates select="@id"/>
          </td>
          <td>
            <xsl:apply-templates select="title"/>
          </td>
          <td>
            <xsl:apply-templates select="Director"/>
          </td>
          <td>
            <xsl:apply-templates select="year"/>
          </td>
        </tr>
      </xsl:if>  
    </table>
  </xsl:template>
  <!-- template for color and font use for text in each element-->
  <xsl:template match="@id">
    <span style="font-family:arial; color:blue;">
      <xsl:value-of select="."/>
    </span>
  </xsl:template>

  <xsl:template match="title">
    <span style="font-family:arial; color:blue;">
      <xsl:value-of select="."/>
    </span>
  </xsl:template>

  <xsl:template match="Director">
    <span style="font-family:arial; color:blue;">
      <xsl:value-of select="."/>
    </span>
  </xsl:template>

  <xsl:template match="year">
    <span style="font-family:arial; color:blue;">
      <xsl:value-of select="."/>
    </span>
  </xsl:template>

</xsl:stylesheet>

我创建了一个if语句但只适用于第一个表。我可以使用choose语句创建表并测试元素吗?

1 个答案:

答案 0 :(得分:2)

match="year"模板中,您使用条件test="year>=2005"。 XPath表达式中的裸名year表示./child::year,即选择上下文节点的year个子节点。但是上下文节点是year元素,我怀疑它有一个名为year的子节点。使用test=".>=2005"

我怀疑year元素没有名为titleDirector的子元素。我怀疑你真正想要的是拥有match="movie[year>=2005]"的一个模板规则和match="movie[year<2005]"的一个模板规则。

但由于您没有显示您的输入或预期输出,因此很难确切知道您要实现的目标。