XSLT:显示一个节点的多个实例

时间:2018-12-06 21:24:38

标签: xml xslt

我只是有一个小问题,似乎无法弄清楚自己在做什么错。我是XSLT的新手,所以如果我犯了新手错误或提出类似问题,我深表歉意。我只是有一个包含电影数据的简单XML文件,并且试图显示每部电影的所有流派。有些电影有多种类型,有些只有一种。但是,当我尝试实现解决方案时,我似乎根本没有任何输出。

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

<?xml-stylesheet type="text/xsl" href="movies.xsl"?> 

<movies>

  <movie>
    <title lang="en">Spider-Man: Into the Spider-Verse</title>
    <poster-url>https://resizing.flixster.com/b5taZMzly27b3UlO8PArsKvP3qM=/fit-in/200x296.2962962962963/v1.bTsxMjg3MjM1MDtqOzE3OTIzOzEyMDA7NjA3Mjs5MDAw</poster-url>
    <trailer src="http://www.intothespiderverse.movie/#trailer"/>
    <release-date><year>2018</year> <month>12</month> <day>14</day></release-date>
    <director>Bob Persichetti</director>
    <director>Peter Ramsey</director>
    <director>Rodney Rotham</director>
    <genre>action</genre>
    <genre>animated</genre>
    <genre>superhero</genre>
    <runtime>100</runtime>
    <actor>Shameik Moore</actor>
    <actor>Hailee Steinfeld</actor>
    <actor>Mahershala Ali</actor>
    <mpaa>
      <rating>PG</rating>
    </mpaa>
    <studio>Sony Pictures</studio>
    <reviews>
    </reviews>
  </movie>

和我的XSLT代码段

          <xsl:choose>
            <xsl:when test="count(genre) > 1">
              Genres:
              <xsl:for-each select="genre">
                <xsl:value-of select="genre"/>
              </xsl:for-each>
            </xsl:when>
            <xsl:otherwise>
              Genre:
              <xsl:value-of select="genre"/>
            </xsl:otherwise>
          </xsl:choose>

这是我的整个文档。

    <?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
  <xsl:template match="/"> 
    <html> 
      <head> 
        <title>Movies Movies Movies</title> 
      </head> 
      <body> 
       <h1>Movies Movies Movies</h1>
       <ul>
         <xsl:for-each select="movies/movie">
           <li><xsl:value-of select="title"/>
              <br/>
              <img>
                <xsl:attribute name="src">
                  <xsl:value-of select="poster-url"/>
                </xsl:attribute>
              </img>
              See the
              <xsl:choose>
                <xsl:when test="not(trailer)">
                  <a>
                    <xsl:attribute name="href">
                      <xsl:value-of select="translate(review,' ','+')"/>
                    </xsl:attribute>
                    <xsl:text>reviews</xsl:text>
                  </a>
                </xsl:when>
                <xsl:otherwise>
                  <a>
                    <xsl:attribute name="href">
                      <xsl:value-of select="translate(trailer,' ','+')"/>
                    </xsl:attribute>
                    <xsl:text>trailer</xsl:text>
                  </a>
                  and
                  <a>
                    <xsl:attribute name="href">
                      <xsl:value-of select="translate(review,' ','+')"/>
                    </xsl:attribute>
                    <xsl:text>reviews</xsl:text>
                  </a>

                </xsl:otherwise>
              </xsl:choose>
              <br/>
              <xsl:choose>
                <xsl:when test="count(genre) > 1">
                  Genres:
                  <xsl:for-each select="genre">
                    <xsl:value-of select="genre"/>
                  </xsl:for-each>
                </xsl:when>
                <xsl:otherwise>
                  Genre:
                  <xsl:value-of select="genre"/>
                </xsl:otherwise>
              </xsl:choose>
              <br/>
              Released:  
              <xsl:value-of select="release-date/year"/>
              <xsl:value-of select="format-number(release-date/month,'-00')"/>
              <xsl:value-of select="format-number(release-date/day,'-00')"/>
           </li>
         </xsl:for-each>
       </ul>

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

在上面的代码段中,我首先确认电影是否具有一种或多种类型。如果它不止一个,我将开始一个循环并尝试显示所有与该流派相关的流派并结束循环。如果只有1个,那么它很好并且很简单,我只显示类型。它的多种流派显示似乎不起作用,只有一种显示的电影就好了。我认为这可能与我的for-each循环有关,可能不在正确的位置吗?  谢谢!

1 个答案:

答案 0 :(得分:1)

我猜(!)您在movie的上下文中。在这种情况下,说明:

<xsl:for-each select="movie/genre">

不选择任何内容。

要处理当前genre的子元素movie,您必须执行以下操作:

<xsl:for-each select="genre">

已添加:

您在这里再次犯了同样的错误:

<xsl:for-each select="genre">

将您置于genre的上下文中。在这种情况下,说明:

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

不选择任何内容。 genre本身不是孩子。您需要这样做:

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

({.选择上下文节点。)