Узлы с нечувствительным к регистру содержимым с использованием XOM - PullRequest
2 голосов
/ 29 января 2011

Я хочу запросить узлы из документа XOM, который содержит определенное значение, но без учета регистра. Примерно так:

doc.query('/root/book[contains(.,"case-insentive-string")]')

Но он содержит с учетом регистра.

  1. Я пытался использовать регулярные выражения, но это только XPATH2.0 и XOM не кажется поддержать это.
  2. Я пытался contains(translate(."ABCEDF...","abcdef..."),"case-insentive-string")]' тоже не удалось.
  3. Я пытался соответствовать подузлы и читать родительские атрибуты используя getParent, но нет способ чтения родительских атрибутов.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 29 января 2011

Если вы используете XOM, вы можете использовать Saxon для запуска XPath или XQuery против него.Это дает вам возможность использовать значительно расширенную библиотеку функций в XPath 2.0, которая включает функции в нижнем регистре () и верхнем регистре (), а также возможность (хотя и в некоторой степени для конкретного продукта) выбирать собственные сопоставлениядля использования с функциями, такими как contains () - это означает, что вы можете сделать сопоставление, которое игнорирует, например, ударения и регистр.

2 голосов
/ 29 января 2011

2.Я попытался содержит (перевод ((. "ABCEDF ...", "abcdef ..."), "case-insentive-string")] 'тоже не удался.

Правильный способ написать это: :

/root/book[contains(translate(., $vUpper, $vLower),
                    translate($vCaseInsentiveString, $vUpper, $vLower)
                    )
          ]

, где $vUpper и $vLower определены как (должны быть заменены) строки:

'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

и

'abcdefghijklmnopqrstuvwxyz'

и $vCaseInsentiveString определяется как (должна быть заменена) конкретная строка без учета регистра.

Например, с учетом следующего XMLdocument :

<authors>
  <author>
    <name>Victor Hugo &amp; Co.</name>
    <nationality>French</nationality>
  </author>
  <author period="classical" category="children">
    <name>J.K.Rollings</name>
    <nationality>British</nationality>
  </author>
  <author period="classical">
    <name>Sophocles</name>
    <nationality>Greek</nationality>
  </author>
  <author>
    <name>Leo Tolstoy</name>
    <nationality>Russian</nationality>
  </author>
  <author>
    <name>Alexander Pushkin</name>
    <nationality>Russian</nationality>
  </author>
  <author period="classical">
    <name>Plato</name>
    <nationality>Greek</nationality>
  </author>
</authors>

следующее выражение XPath (подставьте переменные соответствующими строками):

   /*/author/name
              [contains(translate(., $vUpper, $vLower),
                        translate('lEo', $vUpper, $vLower)
                        )
              ]

выбирает этот элемент :

<name>Leo Tolstoy</name>

Пояснение : Оба аргумента функции contains() преобразуются в нижний регистр, а затем выполняется сравнение.

...