首页 > 解决方案 > 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循环可能不在正确的位置有关?谢谢!

标签: xmlxslt

解决方案


我猜(!)你在movie. 在这种情况下,指令:

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

什么都不选择。

要处理作为genrecurrent 子元素的元素movie,您必须执行以下操作:

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

添加:

在这里你又犯了同样的错误:

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

将您置于genre. 在这种情况下,指令:

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

什么都不选择。genre不是自己的孩子。你需要做:

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

.选择上下文节点。)


推荐阅读