【问题标题】:Generate a dynamic <table> from XML with XSLT使用 XSLT 从 XML 生成动态 <table>
【发布时间】:2011-03-24 17:01:39
【问题描述】:

我正在尝试使用输入 XML 做一个简单的动态 &lt;table&gt;。我的 XML 代码如下所示:

    <table>
        <col size="5%">#</col>
        <col size="55%">Title</col>
        <col size="10%">Author</col>
        <col size="10%">Date</col>
        <col size="10%">Modification</col>
        <col size="10%">Actions</col>

        <output>
            <row>1</row>
            <row>Title of the entry</row>
            <row>Administrator</row>
            <row>dd/mm/yyyy hh:mm</row>
            <row>dd/mm/yyyy hh:mm</row>
            <row>Edit Delete</row>
        </output>
    </table>

我生成这个是因为我不想为后端面板使用一个 XSLT,它根据不同部分的变量将我的输出 XML 转换为 &lt;table&gt;

我做了这个 XSLT 代码:

                <table>
                    <tr>
                        <xsl:for-each select="page/index/table/col">
                            <td>
                                <xsl:attribute name="width"><xsl:value-of select="size" /></xsl:attribute>
                                <xsl:value-of select="." />
                            </td>
                        </xsl:for-each>
                    </tr>
                    <xsl:for-each select="page/index/table/output">
                        <tr>
                            <xsl:for-each select="row">
                                <td>
                                    <xsl:value-of select="." />
                                </td>
                            </xsl:for-each>
                        </tr>
                    </xsl:for-each>
                </table>

我生成了表格,但是我无法获取用 col/size 的值填充的属性 WIDTH。

我该怎么做?

【问题讨论】:

  • 好问题 (+1)。请参阅我的答案以了解您的问题的解决方案 + 以更简单的方式完全重写转换。

标签: xml xslt xhtml html-table


【解决方案1】:

使用

  <td width="{@size}"><xsl:value-of select="."/></td>

在 XSLT 中,建议尽可能避免使用 &lt;xsl:for-each&gt;

没有&lt;xsl:for-each&gt;的完整转换是:

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

 <xsl:template match="table">
   <table>
    <tr>
      <xsl:apply-templates select="col"/>
    </tr>
    <xsl:apply-templates select="output"/>
   </table>
 </xsl:template>

 <xsl:template match="col">
  <td width="{@size}"><xsl:value-of select="."/></td>
 </xsl:template>

 <xsl:template match="output">
  <tr>
   <xsl:apply-templates/>
  </tr>
 </xsl:template>

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

当此转换应用于以下 XML 文档时(原始 XML 片段,包含在 indexpage 元素中):

<page>
    <index>
        <table>
            <col size="5%">#</col>
            <col size="55%">Title</col>
            <col size="10%">Author</col>
            <col size="10%">Date</col>
            <col size="10%">Modification</col>
            <col size="10%">Actions</col>
            <output>
                <row>1</row>
                <row>Title of the entry</row>
                <row>Administrator</row>
                <row>dd/mm/yyyy hh:mm</row>
                <row>dd/mm/yyyy hh:mm</row>
                <row>Edit Delete</row>
            </output>
        </table>
    </index>
</page>

产生想要的正确结果

<table>
   <tr>
      <td width="5%">#</td>
      <td width="55%">Title</td>
      <td width="10%">Author</td>
      <td width="10%">Date</td>
      <td width="10%">Modification</td>
      <td width="10%">Actions</td>
   </tr>
   <tr>
      <td>1</td>
      <td>Title of the entry</td>
      <td>Administrator</td>
      <td>dd/mm/yyyy hh:mm</td>
      <td>dd/mm/yyyy hh:mm</td>
      <td>Edit Delete</td>
   </tr>
</table>

【讨论】:

  • +1 好答案。在文字结果中使用 AVT 可以使代码紧凑。
【解决方案2】:

size 属性的选择器应为@size 而不仅仅是size,即:

<xsl:value-of select="@size" />

【讨论】:

    【解决方案3】:

    尝试@size 而不是size:您正在寻找的是属性,而不是元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 2011-04-26
      • 2012-11-10
      • 1970-01-01
      • 2010-09-24
      • 2012-05-23
      • 2015-07-24
      相关资源
      最近更新 更多