XPath语法以使查询排除某些特定元素

时间:2019-11-17 08:29:03

标签: xpath google-sheets-importxml

您可以在https://sabbiobet.netsons.org/test.html上找到我的测试html页面

这是页面的html标记:

<table border="1" class="class_table">
    <tbody>
        <tr class="class_tr">
            <td class="class_td">&nbsp;</td>
        </tr>
        <tr class="class_tr">
            <td class="class_td"><span class="class_span_ok"></span>square</td>
        </tr>
        <tr class="class_tr">
            <td class="class_td"><span class="class_span_ko"></span>circle</td>
        </tr>
        <tr class="class_tr">
            <td class="class_td"><span class="class_span_ok"></span>triangle</td>
        </tr>
    </tbody>
</table>

我需要获取<td>class="class_td"中的所有文本,减去文本为空或&nbsp;或孩子<span>中带有{{1}的文本}。

换句话说,我只想获得这些值:

class="class_ko"

使用Google表格的importXML函数,并按照我尝试过的其他用户的建议进行操作:

Square
Triangle

但是它只有在我在“ span”和“ / span”之间放置一些文本时才有效

没有任何文字,我只会得到一个空的结果。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

如果将提供的格式不正确的文档更正,请用等价的字符实体引用>>> step_1 ['Gourds', 'watermelon', 'Post', 'pounder', 'calf', 'hay', 'or', 'duck', 'is', 'tool', 'shed', 'horse', 'In', 'eggplant', 'quonset', 'is', 'grain', 'bins', 'grain', 'trucks', 'quonset', 'pole', 'shed', 'with', 'fences', 'gates', 'zucchini', 'carrots', 'scrap', 'metal', 'Peacocks', 'baa', 'ostriches', 'owls', 'Kidney', 'beans', 'ostrich', 'trucks', 'Gourds', 'utters', 'at', 'welding', 'equipment', 'a', 'oink', 'oink', 'haybine', 'Apples', 'ducks', 'straw', 'quail', 'a', 'ostriches', 'donkey', 'hay', 'hook', 'cucumbers', 'Kidney', 'beans', 'ostrich', 'trucks', 'Combine', 'Harvester', 'swather', 'baler', 'as', 'haybine', 'parsley', 'melon', 'in', 'ha.\n'] 替换未定义的实体&nbsp;

&#xA0;

然后这个XPath表达式

<table border="1" class="class_table"> <tbody> <tr class="class_tr"> <td class="class_td">&#xA0;</td> </tr> <tr class="class_tr"> <td class="class_td"><span class="class_span_ok"></span>square</td> </tr> <tr class="class_tr"> <td class="class_td"><span class="class_span_ko"></span>circle</td> </tr> <tr class="class_tr"> <td class="class_td"><span class="class_span_ok"></span>triangle</td> </tr> </tbody> </table>

在评估时,会精确选择所需的/*/*/*/td [@class='class_td' and not(span[@class='class_span_ko']) and normalize-space(translate(., '&#xA0;', '')) ]/> 元素

td

基于XSLT的验证

此转换对上面的XPath表达式求值,并将所选元素复制到输出:

<td class="class_td">
   <span class="class_span_ok"/>square</td>
<td class="class_td">
   <span class="class_span_ok"/>triangle</td>

产生了所需的正确结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:copy-of select=
    "/*/*/*/td
        [@class='class_td'
        and not(span[@class='class_span_ko'])
        and normalize-space(translate(., '&#xA0;', ''))
        ]"/>
  </xsl:template>
</xsl:stylesheet>

注意

如果仅需要所需元素的字符串值,则XPath表达式可以是:

<td class="class_td">
   <span class="class_span_ok"/>square</td>
<td class="class_td">
   <span class="class_span_ok"/>triangle</td>