【问题标题】:Ruby Nokogiri - XPATH using URLRuby Nokogiri - 使用 URL 的 XPATH
【发布时间】:2014-09-21 14:00:53
【问题描述】:

我有这张桌子:

 <tr>
      <td><b>Amount</b></td>
      <td><b>Due Date</b></td>
      <td"><b>Link</b></td>
  </tr>

<tr>
  <td>02/13/2012</td>
  <td>$81.66</td>
  <td><a onclick="javascript:window.open('/cso/displaypdfbill?selectedBillkey=449409587','_blank');" href="javascript: void(0);">View Bill</a></td>

</tr>
<tr>
  <td>01/13/2012</td>
  <td>$181.66</td>
  <td><a onclick="javascript:window.open('/cso/displaypdfbill?selectedBillkey=543409587','_blank');" href="javascript: void(0);">View Bill</a></td>

</tr>

我正在遍历表格并在每一行中提取 Bill 键。我删除了Billkey 并将其存储到一个变量中。

BillKey = 449409587

我想要的是获得BillKey所在的&lt;tr&gt;

所以我应该有:

2/13/2012      81.86     View Bill

我在编写 XPATH 以获取 &lt;tr&gt; 时遇到问题。

【问题讨论】:

    标签: ruby xpath nokogiri


    【解决方案1】:

    使用

       string(table/tr
                [td/a/@onclick
                      [substring
                        (.,
                         string-length()
                       - 21
                        )
                      =
                       $vEnding
                      ]
                ]
             )
    

    $vEnding 必须替换为字符串"=449409587','_blank');"

    所以,这个替换后的完整 XPath 表达式是:

       string(table/tr
                [td/a/@onclick
                      [substring
                        (.,
                         string-length()
                       - 21
                        )
                      =
                       "=449409587','_blank');"
                      ]
                ]
             )
    

    基于 XSLT 的验证

    此 XSLT 转换

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:variable name="vEnding">=449409587','_blank');</xsl:variable>
    
     <xsl:template match="/">
      <xsl:copy-of select=
      "string(table/tr
                [td/a/@onclick
                      [substring
                        (.,
                         string-length()
                       - 21
                        )
                      =
                       $vEnding
                      ]
                ]
             )
      "/>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于以下 XML 文档时(提供的包含在单个顶部元素 table 中):

    <table>
        <tr>
            <td>
                <b>Amount</b>
            </td>
            <td>
                <b>Due Date</b>
            </td>
            <td>
                <b>Link</b>
            </td>
        </tr>
        <tr>
            <td>02/13/2012</td>
            <td>$81.66</td>
            <td>
                <a onclick=
                "javascript:window.open('/cso/displaypdfbill?selectedBillkey=449409587','_blank');" href="javascript: void(0);">View Bill</a>
            </td>
        </tr>
        <tr>
            <td>01/13/2012</td>
            <td>$181.66</td>
            <td>
                <a onclick=
                "javascript:window.open('/cso/displaypdfbill?selectedBillkey=543409587','_blank');" href="javascript: void(0);">View Bill</a>
            </td>
        </tr>
    </table>
    

    评估 XPath 表达式并将评估结果复制到输出

        02/13/2012
        $81.66
    
            View Bill
    

    【讨论】:

    • 我无法让这个工作。你有 $vEnding = = =449409587','_blank',但我只有 $vEnding = 449409587。有没有办法在 onclick 包含 449409587 的地方做到这一点?
    • @user1198316:是的,在 XPath 1.0 中,我们正在使用 substring($s, string-length() - string-length($p) +1) = string-length($p) 实现仅限 XPath 2.0 的函数 ends-with($s, $p)。因此,在任何情况下,您都必须获取标识结束字符串的 string-length() 并将其放入您的表达式中。
    • @user1198316:我对提供的 XML 文档的回答(如我的回答)中对 XPath 表达式的评估会产生报告的结果。我总是测试代码,实际上我复制/粘贴了运行此代码的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多