如何使用xslt从XML元素属性和XML标记创建html表

时间:2011-12-08 19:00:39

标签: html xml xslt html-table

我是xslt的新手,所以如果有人能帮助我,我会非常感激... 我有这样的XML:

        <dummy>
        <element name="O">
            <description/>
        </element>
        <element name="L">
            <description>abstract for L</description>
        </element>
        <element name="Sd">
            <description>Description for Sd</description>
        </element>
        <element name="Dh">
            <description/>
        </element>
        <element name="P">
            <description/>
        </element>
        <element name="S">
            <description>Some description for S</description>
        </element>
        <element name="A">
            <description/>
        </element>
        <L>2010</L>
        <A>58.78</A>
        <O>O</O>
        <Sd>1101</Sd>
        <S>0.00</S>
        <A>368.38</A>
        <L>2009</L>
        <Sd>1103</Sd>
    </dummy>

我必须有这样的最终html表(使用xslt“1.0”):

            <tr>
    <td>
        I have to select only non element tags one by one, and then replace the tag with the 
        description of the same element name (in case that decription does not exists then display only element name). 
    </td>
    <td>
        Value of non element tag
    </td>
    </tr>


4 example ( upper xml) 
    [in something like for-each]:  take  <L> 2010 </L>  

然后搜索元素名称=“L”(如果description exists = true take 描述别的“L”)和         展示L 2010的摘要

因此给出xml的最终输出4应为:

    <tr><td> abstract for L  </td> <td> 2010 </td> </tr>
    <tr><td> A  </td> <td> 58.78 </td> </tr>
    <tr><td> O  </td> <td> O </td> </tr>
    <tr><td> Description for Sd </td> <td> 1101 </td> </tr>
    <tr><td> Some description for S  </td> <td> 0.00 </td> </tr>
    <tr><td> A  </td> <td> 368.38 </td> </tr>
    <tr><td> abstract for L  </td> <td> 2009</td> </tr>
    <tr><td> Description for Sd </td> <td> 1103 </td> </tr>

xslt必须用xslt =“1.0”

编写

2 个答案:

答案 0 :(得分:0)

它涉及在谓词中使用name()选择'letter'命名元素:

<xsl:template match="element">
    <xsl:param name='name' select="@name" />
    <td><xsl:value-of select="description" /></td>
    <td><xsl:value-of select="//*[name() = $name]" /></td>
</xsl:template>

答案 1 :(得分:0)

我认为您可以在此处使用,通过名称属性

查找元素节点
<xsl:key name="elements" match="element" use="@name" />

首先,您需要匹配所有非元素节点,如此

<xsl:apply-templates select="dummy/*[not(self::element)]" />

然后,要查找匹配的元素描述,您可以使用之前设置的密钥

<xsl:apply-templates select="key('elements', local-name())"/>

在这种情况下,元素节点有两个匹配的模板;一个用于具有描述元素节点,另一个用于没有。

的节点。

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:key name="elements" match="element" use="@name"/>

   <xsl:template match="/">
      <table>
         <xsl:apply-templates select="dummy/*[not(self::element)]"/>
      </table>
   </xsl:template>

   <xsl:template match="*[not(self::element)]">
      <tr>
         <td>
            <xsl:apply-templates select="key('elements', local-name())"/>
         </td>
         <td>
            <xsl:value-of select="."/>
         </td>
      </tr>
   </xsl:template>

   <xsl:template match="element">
      <xsl:value-of select="@name"/>
   </xsl:template>

   <xsl:template match="element[description[node()]]">
      <xsl:value-of select="description"/>
   </xsl:template>
</xsl:stylesheet>

当应用于您的示例XML时,将输出以下HTML:

<table>
   <tr>
      <td>abstract for L</td>
      <td>2010</td>
   </tr>
   <tr>
      <td>A</td>
      <td>58.78</td>
   </tr>
   <tr>
      <td>O</td>
      <td>O</td>
   </tr>
   <tr>
      <td>Description for Sd</td>
      <td>1101</td>
   </tr>
   <tr>
      <td>Some description for S</td>
      <td>0.00</td>
   </tr>
   <tr>
      <td>A</td>
      <td>368.38</td>
   </tr>
   <tr>
      <td>abstract for L</td>
      <td>2009</td>
   </tr>
   <tr>
      <td>Description for Sd</td>
      <td>1103</td>
   </tr>
</table>