2

问题

我正在尝试计算网站显示价格的不同货币的数量。

该网站的主页允许用户从下拉列表中选择一种货币。

我试图找到一个 XPath 表达式来计算下拉列表中的不同货币。

该列表如下所示:

在此处输入图像描述

列表中的前四种货币是用户最常选择的货币。

还会显示按货币代码排序的完整货币列表。完整列表包含前四种货币的重复项。

通过在下拉列表中放置一个禁用的空白选项,“流行”列表和“完整”列表在视觉上是分开的。

主页上用于创建列表的 HTML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<select id="selCurrency" tabindex="122">
  <option value="GBP" selected="selected">Select your currency</option>
  <option value="GBP">GBP - £</option>
  <option value="EUR">EUR - €&lt;/option>
  <option value="PLN">PLN - zł</option>
  <option value="USD">USD - $</option>
  <option value="" disabled="disabled"/>
  <option value="AED">AED - د.إ.‏&lt;/option>
  <option value="AFN">AFN</option>
  <option value="ARS">ARS - $</option>
  <option value="AUD">AUD - $</option>
  <option value="BDT">BDT</option>
  <option value="BGN">BGN - лв.</option>
  <option value="BOB">BOB - Bs.</option>
  <!-- ... -->
</select>

为简洁起见,我删除了屏幕截图中不可见的元素。

尝试的解决方案

我的解决方案的想法是只选择空白分隔符之后的所有节点并将它们计数。

此 XPath 表达式仅选择分隔符:

//*[@id="selCurrency"]/option[@value=""]

根据XPath 轴上的 w3schools 页面,我可以使用以下兄弟轴来选择当前节点之后的所有兄弟姐妹。

按照示例,我尝试了以下表达式:

//*[@id="selCurrency"]/following-sibling::option[@value=""]

但这要么不返回任何内容,要么是非法语法。我不确定是哪个。

如何选择完整币种列表的所有节点,然后进行统计?

4

2 回答 2

3

您需要结合两次尝试来获得正确的项目:

//*[@id="selCurrency"]/option[@value=""]/following-sibling::option

如果你想使用 XPath 来计算这些,这将是计算它们的公式:

count(//*[@id="selCurrency"]/option[@value=""]/following-sibling::option)
于 2013-01-31T16:34:30.507 回答
0

JLRishe 已经回答了提出的问题。

隐藏在问题文本中的是对该问题的更一般的描述:

找到一个 XPath 表达式,它将计算下拉列表中的不同货币。

JLRishe 的答案解决了这个问题,但依赖于元素的顺序。对于习惯使用套装的人来说,这感觉太脆弱了。如果界面设计者删除了分隔行,或者选择停止复制“完整”列表中的“流行”元素,查询将产生误导性结果。

Dimitre Novatchev 的帮助下,我想出了

count(/select/option/@value[not(. = '') and not(. = ../following-sibling::option/@value)])

它过滤掉分隔符值并计算剩余的不同值。当应用于我的示例时,输出为

7

我相信这是我想要解决的问题的更强大的解决方案。

于 2013-02-01T15:17:53.993 回答