Синтаксический анализ XML: как разделить братьев и сестер одного типа на разные ячейки? - PullRequest
0 голосов
/ 09 марта 2012

XML-файл:

<books>
    <scifi key=...>
       <author>Don Larson</author>
       <title>The Edge</title>
       <year>...</year>
    </scifi>
    <scifi key=...>
       <author>Don Larson</author>
       <author>James Kiddleton</author>
       <author>Danny Wobers</author>
       <title>Incognitum</title>
       <year>1987</year>
    </scifi>
    <scifi key=...>
       <author>....</author>
       <author>....</author>
       <title>...</title>
       <year>...</year>
    </scifi>
    etc......................
</books>

XSL-файл:

<xsl:template match="/">
  <html>
  <body>
    <center><h1>SciFi</h1>
    <table border="1">
    <tr>
      <th>Title</th>
      <th>Authors</th>
      <th>Year</th>
    </tr>
      <xsl:for-each select="books/scifi">
      <xsl:sort select="year"/>
    <tr>
      <td><center><xsl:value-of select="title"/></center></td>
      <td>
       <xsl:for-each select="author">
        <p><xsl:value-of select="."/></p>
        </xsl:for-each>
      </td> 
      <td><xsl:value-of select="year"/></td>
    </tr>
    </xsl:for-each>
    </table>
    </center>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet> 

Когда отображается приведенная выше таблица, для каждой ячейки, содержащей заголовок, в ячейке рядом с ней содержатся все авторы, связанные с этим заголовком

например:

    Title         Authors        Year
   (1cell)        (1cell)       (1cell)
    -----         -------        ----
                 Don Larson
 Incognitum   James Kiddleton    1987
                Danny Wobers

Теперь я хочу, чтобы для каждого заголовка отображались авторы (если их больше ...), связанные с ним в отдельных ячейках, и получалось что-то вроде этого:

    Title         Authors        Year
   (3cells)        (3cells)    (3cells)
    -----         -------        ----
 Incognitum      Don Larson      1987
 Incognitum   James Kiddleton    1987
 Incognitum     Danny Wobers     1987

Вместо того, чтобы иметь одну ячейку для заголовка и одну ячейку, содержащую всех трех авторов, связанных с этим заголовком, я хочу иметь три ячейки с одинаковым заголовком, и каждая из этих ячеек может иметь ячейку с соответствующим автором рядом с ней.

Я все еще хочу сортировать все по годам, и я все еще хочу, чтобы порядок моих ячеек (слева-> справа) был Титул-> Автор-> Год

Что мне нужно изменить в моем XSL-файле?

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

Быстрое исправление -

<xsl:template match="/">
  <html>
  <body>
    <center><h1>SciFi</h1>
    <table border="1">
    <tr>
      <th>Title</th>
      <th>Authors</th>
      <th>Year</th>
    </tr>
      <xsl:for-each select="books/scifi">
        <xsl:sort select="year"/>
        <xsl:for-each select="author">
    <tr>
      <td><center><xsl:value-of select="../title"/></center></td>
      <td>
       <xsl:for-each select=".">
        <p><xsl:value-of select="."/></p>
        </xsl:for-each>
      </td> 
      <td><xsl:value-of select="../year"/></td>
    </tr>
       </xsl:for-each>
    </xsl:for-each>
    </table>
    </center>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet> 

, но в долгосрочной перспективе я бы предложил перейти от одного шаблона, сделав все это с вложенным для каждого, к структурированной таблице стилей с шаблонами, отображающими каждый тип элемента в результат, а затемделаю apply-шаблоны, чтобы продолжать идти.

0 голосов
/ 09 марта 2012

Вы хотите одну строку на автора, поэтому измените

<tr>
  <td><center><xsl:value-of select="title"/></center></td>
  <td>
   <xsl:for-each select="author">
    <p><xsl:value-of select="."/></p>
    </xsl:for-each>
  </td> 
  <td><xsl:value-of select="year"/></td>
</tr>

до

 <xsl:for-each select="author">
<tr>
  <td><center><xsl:value-of select="../title"/></center></td>
  <td>

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

  </td> 
  <td><xsl:value-of select="../year"/></td>
</tr>
  </xsl:for-each>

David

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