xslt从xml中读取单独的元素,不起作用

时间:2015-10-24 01:59:18

标签: xml object xslt

我有一个像这样的xml:

<movies>
	<!-- 1 -->
    <movie>      
        <movieID>0108052</movieID>     
        <title>Schindler's List</title>
        <director>Steven Spielberg</director>  
        <year>1993</year>
        <genre>Biography, </genre>
		<genre>Drama, </genre>
		<genre>History</genre>
		<link>http://www.imdb.com/title/tt0108052/</link>
    </movie>
	<!-- 2 -->
    <movie>      
        <movieID>0914798</movieID>     
        <title>The Boy in the Striped Pajamas</title>
        <director>Mark Herman</director>  
        <year>2008</year>
        <genre>Biography, </genre>
		<genre>Drama, </genre>
		<genre>History</genre>
		<link>http://www.imdb.com/title/tt0914798/</link>		
    </movie>
</movies>
  

现在它应该读取并输出如下:(不同的电影以显示多样性)

<tr bgcolor="#3D9999">
  <td><a href="http://www.imdb.com/title/tt0091369/" target="_blank">Labyrinth</a>
  </td>
  <td>Jim Henson</td>
  <td>1986</td>
  <td>Adventure, Family, Fantasy</td>
  <td>0091369</td>
</tr>

但相反,我得到了这个:

  <td>Adventure, </td>

MY xslt看起来像这样:

<?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>
    <!-- Background image -->
    <body background="bgimage.jpg">
      <h2 style="color:#47B2B2">My Movie Collection</h2>
      <h3 style="color:#47B2B2">Movies After 2005:</h3>
      <!-- set border, color, and padding Movies after 2005-->
      <table border="1" bgcolor="#0A1A1A" cellpadding="5">
        <tr bgcolor="#1F4C4C">
          <!-- Set order -->
          <th>Title</th>
          <th>Director</th>
          <th>Year</th>
          <th>Genre</th>
          <th>ID</th>
        </tr>
        <xsl:for-each select="movies/movie">
          <!-- Sort by title -->
          <xsl:sort select="title" />
          <xsl:if test="year>=2005">
            <tr bgcolor="#3D9999">
              <td>
                <!-- Look for link, target to blank, the link text is the tittle pulled from xml -->
                <a href="{link}" target="_blank">
                  <xsl:value-of select="title" />
                </a>
              </td>
              <td>
                <xsl:value-of select="director" />
              </td>
              <td>
                <xsl:value-of select="year" />
              </td>
              <td>
                <xsl:value-of select="genre" />
              </td>
              <td>
                <xsl:value-of select="movieID" />
              </td>
            </tr>
          </xsl:if>
        </xsl:for-each>
      </table>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

第47行处理它应该如何读取它,但它不起作用它只读取第一个。

1 个答案:

答案 0 :(得分:2)

这正是xsl:value-of在这种情况下的作用。快速解决方案是换出

<xsl:value-of select="genre"/>

<xsl:apply-templates select="genre"/>

假设您没有能够处理“类型”的模板。元素,这将使用XSLT的内置模板并输出文本。如果失败,你可以随时回头

<xsl:for-each select="genre">
  <xsl:value-of select="."/>
</xsl:for-each>

顺便提一下,虽然它可能会使您的解决方案变得更容易,但在数据中包含分隔逗号是非常糟糕的XML设计。例如,如果您必须同时检测两种类型的电影,那么查询哪些电影具有特定类型就更加困难。和&#39;流派,&#39;。如果源数据被更改为不包含逗号,则可以执行以下操作:

<xsl:for-each select="genre">
  <xsl:value-of select="."/>
  <xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>

但是,如果您曾升级到XSLT 2.0,则可以执行此操作:

<xsl:value-of select="genre" separator=", "/>

将使用给定的分隔符输出所有类型元素。