1

如何使用 and 运算符“|” 计算 2 个节点集?换句话说,计算 2 个具有不同标签名称的兄弟姐妹的数据。在这种情况下:我想要来自 edition 和 edition2 标签的数据。我试过'| 它没有用。

XML:

<?xml version="1.0" encoding="utf-8"?>
<wikimedia>
  <projects>
    <project name="Wikipedia" launch="2001-01-05">
      <editions>
        <edition language="English">en.wikipedia.org</edition>
        <edition language="German">de.wikipedia.org</edition>
        <edition language="French">fr.wikipedia.org</edition>
        <edition language="Polish">pl.wikipedia.org</edition>
        <edition language="Spanish">es.wikipedia.org</edition>
        <edition2 language="Spanglish">egs.wikipedia.org</edition2>
        <img src="hello.gif">hello</img>
      </editions>
    </project>
    <project name="Wiktionary" launch="2002-12-12">
      <editions>
        <edition language="English">en.wiktionary.org</edition>
        <edition language="French">fr.wiktionary.org</edition>
        <edition language="Vietnamese">vi.wiktionary.org</edition>
        <edition language="Turkish">tr.wiktionary.org</edition>
        <edition language="Spanish">es.wiktionary.org</edition>
        <edition2 language="Spanglish">egs.wiktionary.org</edition2>
        <img src="hello.gif">hello</img>
      </editions>
    </project>
  </projects>
</wikimedia>

Python :

>>> wikixml.xpath('//edition/text() | edition2/text()')
['en.wikipedia.org', 'de.wikipedia.org', 'fr.wikipedia.org', 'pl.wikipedia.org', 'es.wikipedia.org', 'en.wiktionary.org', 'fr.wiktionary.org', 'vi.wiktionary.org', 'tr.wiktionary.org', 'es.wiktionary.org']

编辑

我得到它的答案后工作,但我也想选择img/@src 我设法做到这一点使用联合运算符的值|

>>> wikixml.xpath('//edition/text() | //edition2/text() | //img/@src')
['en.wikipedia.org', 'de.wikipedia.org', 'fr.wikipedia.org', 'pl.wikipedia.org', 'es.wikipedia.org', 'egs.wikipedia.org', 'hello.gif', 'en.wiktionary.org', 'fr.wiktionary.org', 'vi.wiktionary.org', 'tr.wiktionary.org', 'es.wiktionary.org', 'egs.wiktionary.org', 'hello.gif']

如何使用单个谓词和self此处使用两个元素完成的符号来执行此操作

/wikimedia/projects/project/editions/ *[self::edition or self::edition2]/text()

现在我们有了@srcand text()?

4

2 回答 2

4

采用

wikixml.xpath('//edition/text() | //edition2/text()')

或更有效地

wikixml.xpath('//*[self::edition or self::edition2]/text()]

甚至更好

wikixml.xpath('/wikimedia/projects/project/editions/*[self::edition or self::edition2]/text()]

至于问题更新

我也想要img的@src。既然我们有了@src 和 text(),如何使用 self 表示法做到这一点?

老实说,我不知道是否有一种方法可以使用上述符号同时从元素轴和属性轴中进行选择。我对此表示怀疑。

您可以使用单个 XPath 来完成,但放弃 self::notation(至少对于属性):

/wikimedia/projects/project/editions/ *[self::edition or self::edition2]
|
/wikimedia/projects/project/editions/img/@src

或 select editionedition2以及所有包含src属性的元素

/wikimedia/projects/project/editions/ *[self::edition or self::edition2 or attribute::src]

然后处理结果以获取src

这与您在XPath 1.0中 所能做的差不多 根据 Dimitre Novatchev 的建议,XPath 2.0允许您这样编写:

/wikimedia/projects/project/editions/(*[self::edition or self::edition2] | img/@src )
于 2012-06-21T20:03:17.117 回答
2

使用

   /*/*/project/editions/*[not(self::img)]
|
   /*/*/project/editions/img/@src

或在 XPath 2.0 中使用

/*/*/project/editions
               /(*[not(self::img)] | img/@src)
于 2012-06-22T05:51:51.133 回答