我正在逐步浏览表中每一行的列(td),并尝试获取关联的列名,但是遇到了一些麻烦。我希望以编程方式执行此操作,因为我并不总是知道表中的列数,因此我必须在整个项目中重复多次。
编辑:由于工具要求,此版本必须为XSLT 1.0。
示例XML / HTML:
<text>
<table>
<thead>
<tr>
<th>Allergy Name</th>
<th>Reaction Description</th>
<th>Start Date</th>
<th>Severity</th>
<th>Status</th>
<th>Provider</th>
</tr>
</thead>
<tbody>
<tr>
<td>MUCINEX D</td>
<td>Hallucinations</td>
<td>2015/11/19</td>
<td>Critical</td>
<td>Active</td>
<td>Mickey Mouse, MD</td>
</tr>
</tbody>
</table>
</text>
XSLT代码段:
<xsl:for-each select="tr">
<!-Getting other data here-->
<xsl:for-each select="td">
<xsl:value-of select="~COLUMN NAME~"/> <!--Looking for the column name here-->
</xsl:for-each>
</xsl:for-each>
理想情况下,我会得到类似的东西:
Allergy Name: MUCINEX D
,依此类推,遍历表中的每一列。
答案 0 :(得分:1)
您可以尝试以下XSLT-1.0代码。当然,您必须调整一些实际文件布局的路径。
<xsl:for-each select="table/tbody/tr">
<!-- Getting other data here-->
<xsl:for-each select="td">
<xsl:variable name="pos" select="position()" />
<xsl:value-of select="../../../thead/tr/th[$pos]"/> <!--Looking for the column name here-->
<xsl:value-of select="concat(': ',.)"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
变量将当前位置保存在td
元素集中,并将其用作th
元素的索引。 th
元素是通过相对路径访问的;绝对路径可能会更好,但这取决于文件布局以及您要处理多个表还是仅处理一个表。
其输出为:
Allergy Name: MUCINEX D
Reaction Description: Hallucinations
Start Date: 2015/11/19
Severity: Critical
Status: Active
Provider: Mickey Mouse, MD
或者,您也可以通过小技巧使用xsl:key
。可能这会更快,但使用多个表会感到不舒服。
但是,这是样式表的外观:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="no" />
<xsl:key name="hdr" match="tr/th" use="count(preceding-sibling::th) + 1" />
<xsl:template match="/text">
<xsl:for-each select="table/tbody/tr">
<!-- Getting other data here-->
<xsl:for-each select="td">
<xsl:value-of select="key('hdr',position())" />
<xsl:value-of select="concat(': ',.)"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出是相同的。