我有兴趣将一个简单的表转换为一组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>
我尝试了几种方法,但都没有效果。我希望在正确的方向上找到解决方案或指针。
答案 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>