Подтвердить что ты не робот

XPath найти текст в любом тексте node

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

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

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

4b9b3361

Ответ 1

Это выражение //text() = 'Alliance Consulting' имеет значение boolean.

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

<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, конечно.

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

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

например. выражение:

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

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

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

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

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