我有一个结果表,看起来如下:
<table>
<thead>
<tr>
<th>Id</th>
<th>Type</th>
<th>Amount</th>
<th>Price</th>
<th>Name</th>
<th>Expiration</th>
</tr>
</thead>
<tbody>
<tr>
<td>123</td>
<td>Paper</td>
<td>10 pcs.</td>
<td>$10</td>
<td>Premium Copier paper</td>
<td>None</td>
</tr>
<tr>
<td>321</td>
<td>Paper</td>
<td>20 pcs.</td>
<td>$20</td>
<td>Extra Copier paper</td>
<td>None</td>
</tr>
</tbody>
我想用xpath选择整个列的名称,例如:如果按列名“价格”选择,我希望返回的结果是{<td>$10</td>, <td>$20</td>}
的数组。
我是xpath的新手,并不确定如何做到这一点,但我很确定这是可能的。
答案 0 :(得分:25)
好的,我找到了足够的答案并且看起来非常优雅。这里是必需的XPath字符串:
//table/tbody/tr/td[count(//table/thead/tr/th[.="$columnName"]/preceding-sibling::th)+1]
放置列的名称而不是$ columnName。这对我很有用。没有XSL或任何东西,只有纯xpath字符串。如何应用它 - 这是另一个问题。
答案 1 :(得分:1)
您可以使用此XPath:
/table/tbody/tr/td[count(preceding-sibling::td)+1 = count(ancestor::table/thead/tr/th[.='Price']/preceding-sibling::th)+1]
我认为测试position()
的位置(td
)对相关th
的位置是可行的,但在我测试时似乎没有。< / p>
答案 2 :(得分:1)
如果您找到了解决方案,我建议您在此处将其作为答案发布,但只是为了好玩,我就是这样做的:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="kCol" match="td" use="count(. | preceding-sibling::td)"/>
<xsl:param name="column" select="'Price'" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<found>
<xsl:apply-templates select="table/thead/tr/th" />
</found>
</xsl:template>
<xsl:template match="th">
<xsl:if test=". = $column">
<xsl:apply-templates select="key('kCol', position())" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
以“Price”作为参数值运行时:
<found>
<td>$10</td>
<td>$20</td>
</found>
以“名称”作为参数值运行时:
<found>
<td>Premium Copier paper</td>
<td>Extra Copier paper</td>
</found>