将表转换为xml

时间:2016-06-19 18:45:40

标签: html xml xslt html-table

我有兴趣将一个简单的表转换为一组xml元素。该表以两行开头,这两行是属性的简单名称值,但它具有一组测试的嵌入属性。我希望每个测试都是一个带有一组属性的XML元素。我确信有一个直截了当的方法,但我很难设想正确的方法。 输入是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<table border="1">
    <tr>
        <td>Property Heading</td>
        <td>Value Heading</td>
    </tr>
    <tr>
        <td>Property1</td>
        <td>Value 1</td>
    </tr>
    <tr>
        <td>Property2</td>
        <td>Value 2</td>
    </tr>
    <tr>
        <td>test1</td>
        <td>Property t1.1</td>
        <td>Value t1.1</td>
    </tr>
    <tr>
        <td/>
        <td>Property t1.2</td>
        <td>Value t1.2</td>
    </tr>
    <tr>
        <td/>
        <td>Property t1.3</td>
        <td>Value t1.3</td>
    </tr>
    <tr>
        <td>test2</td>
        <td>Property t2.1</td>
        <td>Value t2.1</td>
    </tr>
    <tr>
        <td/>
        <td>Property t2.2</td>
        <td>Value t2.2</td>
    </tr>
</table>

并且所需的输出是

<table>
    <Property1>Value 1</Property1>
    <Property2>Value 2</Property2>
    <test>
        <Property_t1.1>Value t1.1</Property_t1.1>
        <Property_t1.2>Value t1.2</Property_t1.2>
        <Property_t1.3>Value t1.3</Property_t1.3>
    </test>
    <test>
        <Property_t2.1>Value t2.1</Property_t2.1>
        <Property_t2.2>Value t2.2</Property_t2.2>
    </test>
</table>

我尝试了几种方法,但都没有效果。我希望在正确的方向上找到解决方案或指针。

1 个答案:

答案 0 :(得分:0)

这样的事情:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/table">
    <xsl:copy>
      <xsl:element name="{tr[2]/td[1]}">
        <xsl:value-of select="tr[2]/td[2]"/>
      </xsl:element>
      <xsl:element name="{tr[3]/td[1]}">
        <xsl:value-of select="tr[3]/td[2]"/>
      </xsl:element>
      <xsl:apply-templates select="tr[position() > 3][td[1] != '']"/>

    </xsl:copy>
  </xsl:template>

  <xsl:template match="tr">
    <test>
      <xsl:element name="{translate(td[2], ' ', '_')}">
        <xsl:value-of select="td[3]"/>
      </xsl:element>
      <xsl:for-each select="following-sibling::tr[td[1] = '' and preceding-sibling::tr[td[1] != ''][1] = current()]">
        <xsl:element name="{translate(td[2], ' ', '_')}">
          <xsl:value-of select="td[3]"/>
        </xsl:element>
      </xsl:for-each>   
    </test>
  </xsl:template>

</xsl:stylesheet>