использование XSLT как убедиться, что заголовок таблицы печатается только один раз

#javascript #html #xml #xslt #xpath

#javascript #HTML #xml #xslt #xpath

Вопрос:

Я просмотрел учебное пособие по школам W3C для этого, я пытаюсь выяснить, учитывая имеющуюся у меня структуру данных xml, как напечатать заголовок таблицы только один раз !.

вот пример моего xml;

 <data>
    <slice name="TERM1">
        <value name="a">23</value>
        <value name="b">2342</value>
        <value name="c">0.099</value>
        <value name="d">0.09</value>
        <value name="e">0.0730</value>
    </slice>
    <slice name="TERM2">
        <value name="a">0.0655</value>
        <value name="b">0.099</value>
        <value name="c">0.002</value>
        <value name="d">0.015</value>
        <value name="e">0.099</value>
    </slice>
</data>
  

Итак, элемент ‘value’ имеет атрибут ‘name’, и я хотел бы, чтобы это был заголовок столбца для таблицы.

На данный момент так выглядит мой XSLT;

 <?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
    <h2>Data</h2>
    <table border="1">
        <tr>            
        </tr>
        <xsl:for-each select="data/slice">
            <tr>
                <th><xsl:value-of select="@name"/></th>
                <xsl:for-each select="value">                       
                    <td><xsl:value-of select="@name"/><xsl:value-of select="."/></td>
                </xsl:for-each>
            </tr>
        </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>
  

но это дает мне следующий результат;

 TERM1   a23 b2342   c0.099  d0.09   e0.0730
TERM2   a0.0655 b0.099  c0.002  d0.015  e0.099
  

Ответ №1:

На мой взгляд, самый простой способ — использовать push-подход ( xsl:apply-templates вместо xsl:for-each ) и модифицированные шаблоны.

Ввод XML

 <data>
    <slice name="TERM1">
        <value name="a">23</value>
        <value name="b">2342</value>
        <value name="c">0.099</value>
        <value name="d">0.09</value>
        <value name="e">0.0730</value>
    </slice>
    <slice name="TERM2">
        <value name="a">0.0655</value>
        <value name="b">0.099</value>
        <value name="c">0.002</value>
        <value name="d">0.015</value>
        <value name="e">0.099</value>
    </slice>
</data>
  

XSLT 1.0

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="html"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
        <table>
            <xsl:apply-templates select="slice[1]" mode="header"/>                
            <xsl:apply-templates select="slice"/>
        </table>
    </xsl:template>

    <xsl:template match="slice" mode="header">
        <tr>
            <th/>
            <xsl:apply-templates select="value/@name" mode="header"/>
        </tr>
    </xsl:template>

    <xsl:template match="@name" mode="header">
        <th><xsl:value-of select="."/></th>        
    </xsl:template>

    <xsl:template match="slice">
        <tr>
            <td><xsl:value-of select="@name"/></td>
            <xsl:apply-templates/>
        </tr>
    </xsl:template>

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

</xsl:stylesheet>
  

Вывод

 <table>
   <tr>
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
      <th>e</th>
   </tr>
   <tr>
      <td>TERM1</td>
      <td>23</td>
      <td>2342</td>
      <td>0.099</td>
      <td>0.09</td>
      <td>0.0730</td>
   </tr>
   <tr>
      <td>TERM2</td>
      <td>0.0655</td>
      <td>0.099</td>
      <td>0.002</td>
      <td>0.015</td>
      <td>0.099</td>
   </tr>
</table>
  

Комментарии:

1. Спасибо, у меня все отлично получилось, мне просто пришлось немного подправить эту часть <xsl: template match=»parent / parent2 / *»> <таблица> <xsl:apply-templates select=»slice[1]» mode =»header»/> <xsl:apply-templates select =»slice» /> </таблица> </xsl: template>, чтобы более точно соответствовать моему документу.