Xpath-запрос «как» замена - PullRequest
       1

Xpath-запрос «как» замена

3 голосов
/ 06 сентября 2011

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

<Node name="details">
   <Node name="1130482269">
      <Val name="type"><u>2</u></Val>
      <Val name="owner"><n/></Val>
      <Val name="account_number"><u>99-71-39</u></Val>
   </Node>
   <Node name="570722270">
      <Val name="type"><u>2</u></Val>
      <Val name="owner"><n/></Val>
      <Val name="account_number"><u>99 71 40</u></Val>
   </Node>
   <Node name="1845243341">
      <Val name="type"><u>2</u></Val>
      <Val name="owner"><n/></Val>
      <Val name="account_number"><u>9971-41</u></Val>
   </Node>
</Node>

Я пытаюсь выполнить поиск по номеру аккаунта. Но существует так много разных форматов, в которых он может быть. У некоторых есть пробелы, у некоторых есть тире, у некоторых есть смесь и т. Д. Если бы я мог выполнить поиск, удаляя пробелы и тире, я мог бы получить любой номер счета.

Поскольку accountnumber является поисковым запросом, конечная цель состоит в том, чтобы получить номер имени узла второго уровня, выполнив поиск в XPATH, выполнив следующее:

doc = libxml2.parseDoc(xml)
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("/Node/Node[Val[@name='account_number']/*='" + str(accountnumber) + "']/@name")

Есть ли способ использовать поиск XPATH, чтобы удалить все тире и пробелы и оставить только цифры?

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Да, это возможно с помощью функции translate(). Пример:

"translate(Node/Node[@name='1130482269']/Val[@name='account_number'],'- ','')"

выдаст 997139.

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

"translate(
  /Node/Node[@name='" + 
  str(accountnumber) + 
  "']/Val[@name='account_number'],'- ','')"

Обратите внимание на пробел, включенный во второй аргумент перевода '- ' (или даже '-&#x20;'), необходимый для удаления пробелов.

0 голосов
/ 06 сентября 2011

К сожалению, среда libxml2 поддерживает только XPath 1.0, поэтому у вас нет доступа к функциям регулярных выражений XPath 2.0, таким как функция match (). Тем не менее, он поддерживает добавление ваших собственных функций расширения (см. http://xmlsoft.org/XSLT/extensions.html), чтобы вы могли сделать это самостоятельно.

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