XSLT: отображение нескольких экземпляров узла - PullRequest
0 голосов
/ 07 декабря 2018

У меня просто небольшая проблема, я не могу понять, что я делаю неправильно.Я довольно новичок в 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 голосов
/ 07 декабря 2018

Я предполагаю (!), Что вы находитесь в контексте 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="."/>

(. выбирает узел контекста.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...