13

我有一个结果表,如下所示:

<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 的新手,不太确定如何执行此操作,但我很确定这是可能的。

4

3 回答 3

29

好的,我找到了足够的答案并且看起来很优雅。这是所需的 XPath 字符串:

//table/tbody/tr/td[count(//table/thead/tr/th[.="$columnName"]/preceding-sibling::th)+1]

输入列的名称而不是 $columnName。这对我很有效。没有 XSL 或任何东西,只有纯 xpath 字符串。如何应用它 - 这是另一个问题。

于 2013-02-11T06:52:19.843 回答
1

你可以使用这个 XPath:

/table/tbody/tr/td[count(preceding-sibling::td)+1 = count(ancestor::table/thead/tr/th[.='Price']/preceding-sibling::th)+1]

我认为测试相关位置的位置()position()会起作用,但在我测试时似乎没有。tdth

于 2013-02-07T07:25:04.517 回答
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>

当以“价格”作为参数值运行时:

<found>
  <td>$10</td>
  <td>$20</td>
</found>

以“名称”作为参数值运行时:

<found>
  <td>Premium Copier paper</td>
  <td>Extra Copier paper</td>
</found>
于 2013-02-09T05:19:20.490 回答