javascript - 使用 XSLT 如何确保表头仅打印一次

标签 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

最佳答案

在我看来,最简单的方法是采用推送方法(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>

关于javascript - 使用 XSLT 如何确保表头仅打印一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24536424/

相关文章:

javascript - 带有 ng-change 的 Angularjs slider

javascript - Bootstrap 可折叠侧边菜单项

java - java解析xml字符串异常如何解决?

javascript - 如何通过在textarea中当前行末尾按空格键转到下一行

javascript - 抓取通过 JavaScript 呈现的网页。 PhantomJs 或任何其他工具?

javascript:显示隐藏文本适当的宽度

javascript - 使用用户插入的 xml 文件填充 html 表单

xml - 通过 XSLT 使用 CDATA 部分包围 XML 元素

jquery - 如何只滚动到一个div,而不是整个页面?

html - 图像不会随浏览器大小调整大小