将 XML 文本转换为 table
Convert XML text into table
在下面的示例中,我们尝试将 XML 数据转换为 HTML <table>
:
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<NM_TORP_TABLE>
<NM_TORP_TABLE_LIST>
<NM_TORP_LABEL>Nr.</NM_TORP_LABEL>
<NM_TORPCOLUMN_DATA>1 <BR/>2 <BR/>3 <BR/>4 <BR/>5 <BR/>6 <BR/>7 <BR/>8 <BR/>9
<BR/>10<BR/>11<BR/>12<BR/>13<BR/>14<BR/>15<BR/>16</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
<NM_TORP_TABLE_LIST>
<NM_TORP_LABEL>Latitude</NM_TORP_LABEL>
<NM_TORPCOLUMN_DATA>5° 10’ 6" S<BR/>3° 31’ 8" S<BR/>5° 19’ 7" S<BR/>3° 1’ 2" S <BR/>3° 9’ 6" S
<BR/>3° 20’ 9" S<BR/>5° 8’ 3" S <BR/>3° 55’ 9" S<BR/>4° 49’ 3" S<BR/>4° 49’ 8" S<BR/>3° 23’ 9" S<BR/>4° 12’ 3" S<BR/>4° 15’ 3" S<BR/>4° 54’ 0" S<BR/>3° 39’ 9" S<BR/>5° 20’ 3" S</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
<NM_TORP_TABLE_LIST>
<NM_TORP_LABEL>Longitude</NM_TORP_LABEL>
<NM_TORPCOLUMN_DATA>107° 38’ 5" E<BR/>110° 4’ 4" E<BR/>109° 5’ 8" E<BR/>109° 50’ 2" E<BR/>109° 47’ 4" E<BR/>108° 46’ 9" E<BR/>109° 52’ 4" E<BR/>107° 47’ 6" E<BR/>107° 42’ 3" E<BR/>107° 42’ 2" E<BR/>111° 35’ 24" E<BR/>111° 32’ 1" E<BR/>110° 43’ 5" E<BR/>110° 46’ 2" E<BR/>108° 32’ 9" E<BR/>109° 11’ 3" E</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
</NM_TORP_TABLE>
预期输出:
<table>
<tr>
<td>Nr.</td>
<td>Latitude</td>
<td>Longitude</td>
</tr>
<tr>
<td>1</td>
<td>5° 10’ 6" S</td>
<td>107° 38’ 5" E</td>
</tr>
<tr>
<td>2</td>
<td>3° 31’ 8" S</td>
<td>110° 4’ 4" E</td>
</tr>
<tr>
<td>3</td>
<td>5° 19’ 7" S</td>
<td>109° 5’ 8" E</td>
</tr>
.......
</table>
XSLT 代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<table>
<tbody>
<xsl:for-each select="NM_TORP_TABLE/NM_TORP_TABLE_LIST">
<tr>
<td><xsl:value-of select="NM_TORP_LABEL"/></td>
<td><xsl:value-of select="NM_TORPCOLUMN_DATA"/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
您的尝试完全无视您输入的(次优)结构 XML。您需要为第一个 NM_TORPCOLUMN_DATA
元素中的每个文本节点创建一行,并从所有 NM_TORPCOLUMN_DATA
元素中的相应文本节点填充其单元格。
这当然是假设所有 NM_TORPCOLUMN_DATA
元素都具有完全相同数量的文本节点 - 否则我根本看不出这项任务是如何完成的。
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/NM_TORP_TABLE">
<xsl:variable name="cols" select="NM_TORP_TABLE_LIST" />
<table border="1">
<!-- header -->
<tr>
<xsl:for-each select="$cols">
<th>
<xsl:value-of select="NM_TORP_LABEL"/>
</th>
</xsl:for-each>
</tr>
<!-- data -->
<xsl:for-each select="$cols[1]/NM_TORPCOLUMN_DATA/text()">
<xsl:variable name="row" select="position()" />
<tr>
<xsl:for-each select="$cols">
<td>
<xsl:value-of select="NM_TORPCOLUMN_DATA/text()[$row]"/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
应用于您的输入示例,这将产生:
结果
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tr>
<th>Nr.</th>
<th>Latitude</th>
<th>Longitude</th>
</tr>
<tr>
<td>1 </td>
<td>5° 10’ 6" S</td>
<td>107° 38’ 5" E</td>
</tr>
<tr>
<td>2 </td>
<td>3° 31’ 8" S</td>
<td>110° 4’ 4" E</td>
</tr>
<tr>
<td>3 </td>
<td>5° 19’ 7" S</td>
<td>109° 5’ 8" E</td>
</tr>
<tr>
<td>4 </td>
<td>3° 1’ 2" S </td>
<td>109° 50’ 2" E</td>
</tr>
<tr>
<td>5 </td>
<td>3° 9’ 6" S
</td>
<td>109° 47’ 4" E</td>
</tr>
<tr>
<td>6 </td>
<td>3° 20’ 9" S</td>
<td>108° 46’ 9" E</td>
</tr>
<tr>
<td>7 </td>
<td>5° 8’ 3" S </td>
<td>109° 52’ 4" E</td>
</tr>
<tr>
<td>8 </td>
<td>3° 55’ 9" S</td>
<td>107° 47’ 6" E</td>
</tr>
<tr>
<td>9
</td>
<td>4° 49’ 3" S</td>
<td>107° 42’ 3" E</td>
</tr>
<tr>
<td>10</td>
<td>4° 49’ 8" S</td>
<td>107° 42’ 2" E</td>
</tr>
<tr>
<td>11</td>
<td>3° 23’ 9" S</td>
<td>111° 35’ 24" E</td>
</tr>
<tr>
<td>12</td>
<td>4° 12’ 3" S</td>
<td>111° 32’ 1" E</td>
</tr>
<tr>
<td>13</td>
<td>4° 15’ 3" S</td>
<td>110° 43’ 5" E</td>
</tr>
<tr>
<td>14</td>
<td>4° 54’ 0" S</td>
<td>110° 46’ 2" E</td>
</tr>
<tr>
<td>15</td>
<td>3° 39’ 9" S</td>
<td>108° 32’ 9" E</td>
</tr>
<tr>
<td>16</td>
<td>5° 20’ 3" S</td>
<td>109° 11’ 3" E</td>
</tr>
</table>
已渲染
在下面的示例中,我们尝试将 XML 数据转换为 HTML <table>
:
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<NM_TORP_TABLE>
<NM_TORP_TABLE_LIST>
<NM_TORP_LABEL>Nr.</NM_TORP_LABEL>
<NM_TORPCOLUMN_DATA>1 <BR/>2 <BR/>3 <BR/>4 <BR/>5 <BR/>6 <BR/>7 <BR/>8 <BR/>9
<BR/>10<BR/>11<BR/>12<BR/>13<BR/>14<BR/>15<BR/>16</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
<NM_TORP_TABLE_LIST>
<NM_TORP_LABEL>Latitude</NM_TORP_LABEL>
<NM_TORPCOLUMN_DATA>5° 10’ 6" S<BR/>3° 31’ 8" S<BR/>5° 19’ 7" S<BR/>3° 1’ 2" S <BR/>3° 9’ 6" S
<BR/>3° 20’ 9" S<BR/>5° 8’ 3" S <BR/>3° 55’ 9" S<BR/>4° 49’ 3" S<BR/>4° 49’ 8" S<BR/>3° 23’ 9" S<BR/>4° 12’ 3" S<BR/>4° 15’ 3" S<BR/>4° 54’ 0" S<BR/>3° 39’ 9" S<BR/>5° 20’ 3" S</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
<NM_TORP_TABLE_LIST>
<NM_TORP_LABEL>Longitude</NM_TORP_LABEL>
<NM_TORPCOLUMN_DATA>107° 38’ 5" E<BR/>110° 4’ 4" E<BR/>109° 5’ 8" E<BR/>109° 50’ 2" E<BR/>109° 47’ 4" E<BR/>108° 46’ 9" E<BR/>109° 52’ 4" E<BR/>107° 47’ 6" E<BR/>107° 42’ 3" E<BR/>107° 42’ 2" E<BR/>111° 35’ 24" E<BR/>111° 32’ 1" E<BR/>110° 43’ 5" E<BR/>110° 46’ 2" E<BR/>108° 32’ 9" E<BR/>109° 11’ 3" E</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
</NM_TORP_TABLE>
预期输出:
<table>
<tr>
<td>Nr.</td>
<td>Latitude</td>
<td>Longitude</td>
</tr>
<tr>
<td>1</td>
<td>5° 10’ 6" S</td>
<td>107° 38’ 5" E</td>
</tr>
<tr>
<td>2</td>
<td>3° 31’ 8" S</td>
<td>110° 4’ 4" E</td>
</tr>
<tr>
<td>3</td>
<td>5° 19’ 7" S</td>
<td>109° 5’ 8" E</td>
</tr>
.......
</table>
XSLT 代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<table>
<tbody>
<xsl:for-each select="NM_TORP_TABLE/NM_TORP_TABLE_LIST">
<tr>
<td><xsl:value-of select="NM_TORP_LABEL"/></td>
<td><xsl:value-of select="NM_TORPCOLUMN_DATA"/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
您的尝试完全无视您输入的(次优)结构 XML。您需要为第一个 NM_TORPCOLUMN_DATA
元素中的每个文本节点创建一行,并从所有 NM_TORPCOLUMN_DATA
元素中的相应文本节点填充其单元格。
这当然是假设所有 NM_TORPCOLUMN_DATA
元素都具有完全相同数量的文本节点 - 否则我根本看不出这项任务是如何完成的。
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/NM_TORP_TABLE">
<xsl:variable name="cols" select="NM_TORP_TABLE_LIST" />
<table border="1">
<!-- header -->
<tr>
<xsl:for-each select="$cols">
<th>
<xsl:value-of select="NM_TORP_LABEL"/>
</th>
</xsl:for-each>
</tr>
<!-- data -->
<xsl:for-each select="$cols[1]/NM_TORPCOLUMN_DATA/text()">
<xsl:variable name="row" select="position()" />
<tr>
<xsl:for-each select="$cols">
<td>
<xsl:value-of select="NM_TORPCOLUMN_DATA/text()[$row]"/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
应用于您的输入示例,这将产生:
结果
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tr>
<th>Nr.</th>
<th>Latitude</th>
<th>Longitude</th>
</tr>
<tr>
<td>1 </td>
<td>5° 10’ 6" S</td>
<td>107° 38’ 5" E</td>
</tr>
<tr>
<td>2 </td>
<td>3° 31’ 8" S</td>
<td>110° 4’ 4" E</td>
</tr>
<tr>
<td>3 </td>
<td>5° 19’ 7" S</td>
<td>109° 5’ 8" E</td>
</tr>
<tr>
<td>4 </td>
<td>3° 1’ 2" S </td>
<td>109° 50’ 2" E</td>
</tr>
<tr>
<td>5 </td>
<td>3° 9’ 6" S
</td>
<td>109° 47’ 4" E</td>
</tr>
<tr>
<td>6 </td>
<td>3° 20’ 9" S</td>
<td>108° 46’ 9" E</td>
</tr>
<tr>
<td>7 </td>
<td>5° 8’ 3" S </td>
<td>109° 52’ 4" E</td>
</tr>
<tr>
<td>8 </td>
<td>3° 55’ 9" S</td>
<td>107° 47’ 6" E</td>
</tr>
<tr>
<td>9
</td>
<td>4° 49’ 3" S</td>
<td>107° 42’ 3" E</td>
</tr>
<tr>
<td>10</td>
<td>4° 49’ 8" S</td>
<td>107° 42’ 2" E</td>
</tr>
<tr>
<td>11</td>
<td>3° 23’ 9" S</td>
<td>111° 35’ 24" E</td>
</tr>
<tr>
<td>12</td>
<td>4° 12’ 3" S</td>
<td>111° 32’ 1" E</td>
</tr>
<tr>
<td>13</td>
<td>4° 15’ 3" S</td>
<td>110° 43’ 5" E</td>
</tr>
<tr>
<td>14</td>
<td>4° 54’ 0" S</td>
<td>110° 46’ 2" E</td>
</tr>
<tr>
<td>15</td>
<td>3° 39’ 9" S</td>
<td>108° 32’ 9" E</td>
</tr>
<tr>
<td>16</td>
<td>5° 20’ 3" S</td>
<td>109° 11’ 3" E</td>
</tr>
</table>
已渲染