XPath найти текст в любом текстовом узле - PullRequest
35 голосов
/ 22 февраля 2011

Я пытаюсь найти определенный текст в любом текстовом узле в документе, пока мое утверждение выглядит так:

doc.xpath("//text() = 'Alliance Consulting'") do |node|
  ...
end

Это, очевидно, не работает, кто-нибудь может предложить лучшую альтернативу?

1 Ответ

64 голосов
/ 22 февраля 2011

Это выражение //text() = 'Alliance Consulting' превращается в логическое значение.

В случае этого тестового образца:

<r>
    <t>Alliance Consulting</t>
    <s>
        <p>Test string
            <f>Alliance Consulting</f>
        </p>
    </s>
    <z>
        Alliance Consulting
        <y>
            Other string
        </y>
    </z>
</r>

Конечно, вернется true.

Выражение, которое вам нужно вычислить для набора узлов, поэтому используйте:

//text()[. = 'Alliance Consulting']

Например, выражение:

count(//text()[normalize-space() = 'Alliance Consulting'])

против вышеуказанного документа вернет 3.

Чтобы выбрать текстовые узлы, которые содержат 'Alliance Consulting' во всем строковом значении (например, 'Alliance Consulting provides great services'), используйте:

//text()[contains(.,'Alliance Consulting')]

Обратите внимание, что смежные текстовые узлы должны стать единицами после того, как синтаксический анализатор доберется додокумент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...