2015-10-24 2 views
0

я получил XML, как это:XSLT чтения из XML отдельных элементов, не работает

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

Line 47 ручки, как это следует читать, но также он не работает он только читает первый.

ответ

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. Это затрудняет вопрос о том, какие фильмы имеют определенный жанр, например, если вам нужно определить как «жанр», так и «жанр». Если исходные данные либо изменены, чтобы не включать запятой, вы можете сделать это:

<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=", "/> 

, который будет выводит все жанровые элементы с данным разделителем.

+0

Это прекрасное объяснение, спасибо. Я знаю его плохой дизайн xml, но профессор попросил его. Он говорит, прыгая, я спрашиваю, как высоко. –

Смежные вопросы