Есть XPath выражение: "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()". Оно не срабатывает, а выкидывает ошибку, мол не могу выполнить
Другое выражение : "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]" — отрабатывает норм, находит весь тэг Group, у которого есть сабтэг GroupName с содержимым $name
Первое XPath-выражение, которое не срабатывает, должно найти простой текстовый узел на том же уровне, что и референсный тэг Group, который предшествует тэгу Group
Я в составлении XPath-выражения прямо скажу, не силен, мог и облажаться. Вопрос в том — это XPath выражение косячное, или баги в XML/XPath движке?
Здравствуйте, Marty, Вы писали:
M> Есть XPath выражение: "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()". Оно не срабатывает, а выкидывает ошибку, мол не могу выполнить
Я не могу понять описание задачи. Приведи пример входного xml с объяснением чего ты хочешь выбрать.
Твоя конструкция не работает потому preceding-sibling ожидает тег, чтобы выбрать всё поддерево, очевидно что тут использовать text() — бессмыслица.
Вот удобная картинка чтобы понимать что делают разные axes:
M>> Есть XPath выражение: "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()". Оно не срабатывает, а выкидывает ошибку, мол не могу выполнить ·>Я не могу понять описание задачи. Приведи пример входного xml с объяснением чего ты хочешь выбрать.
Я могу выбрать нужный тэг Group через выражение "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]" где name задается как "github_misc_stm32_meekdai_stm32_grbl", и удалить его.
И — мне нужно выбрать текст (который есть пустая строка чисто для отступа, с переводом строки) перед этим тэгом, чтобы его тоже удалить и корректно модифицировать дерево, чтобы не появлялось пустых строк и прочих артефактов.
Потому что если я просто удаляю найденый тег, то остается пустая строка и ненужный перевод строки, и это очень мешает
·>Твоя конструкция не работает потому preceding-sibling ожидает тег, чтобы выбрать всё поддерево, очевидно что тут использовать text() — бессмыслица. ·>Вот удобная картинка чтобы понимать что делают разные axes: ·>Image: 7x1B0.gif
Здравствуйте, Marty, Вы писали:
M>Я могу выбрать нужный тэг Group через выражение "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]" где name задается как "github_misc_stm32_meekdai_stm32_grbl", и удалить его. M>И — мне нужно выбрать текст (который есть пустая строка чисто для отступа, с переводом строки) перед этим тэгом, чтобы его тоже удалить и корректно модифицировать дерево, чтобы не появлялось пустых строк и прочих артефактов. M>Потому что если я просто удаляю найденый тег, то остается пустая строка и ненужный перевод строки, и это очень мешает
Что-то я наврал. preceding-sibling::text() вроде должен работать. Но он выберет все предыдущие узлы text(). Тебе нужен только один [1]. /Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()[1] должно работать, вроде.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: А про XPath вопросы в какой форум задавать?
Здравствуйте, ·, Вы писали:
M>>Я могу выбрать нужный тэг Group через выражение "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]" где name задается как "github_misc_stm32_meekdai_stm32_grbl", и удалить его. M>>И — мне нужно выбрать текст (который есть пустая строка чисто для отступа, с переводом строки) перед этим тэгом, чтобы его тоже удалить и корректно модифицировать дерево, чтобы не появлялось пустых строк и прочих артефактов. M>>Потому что если я просто удаляю найденый тег, то остается пустая строка и ненужный перевод строки, и это очень мешает ·>Что-то я наврал. preceding-sibling::text() вроде должен работать. Но он выберет все предыдущие узлы text(). Тебе нужен только один [1]. ·>/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()[1] должно работать, вроде.
Да, изначально запрос и был точно таким, я его начал упрощать для отладки, чтобы понять, кто врет. Похоже, врет мой XML/XPath движек, буду дебажить
Предлагаю вместо
"/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()"
сделать как-то так
"/Project/Targets/Target/Groups[Group/string(GroupName)=$name]/Files::text()"
Т.е. явно выбирать Grops/Files, но в таких Groups, у которых есть child Group с нужным условием. Не уверен за решение, вообще не знаю XPath.
Re[4]: А про XPath вопросы в какой форум задавать?
Здравствуйте, samius, Вы писали:
S>Предлагаю вместо S>"/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()" S>сделать как-то так S>"/Project/Targets/Target/Groups[Group/string(GroupName)=$name]/Files::text()"
S>Т.е. явно выбирать Grops/Files, но в таких Groups, у которых есть child Group с нужным условием. Не уверен за решение, вообще не знаю XPath.
Group с условием выбрать — не проблема. Можно и отдельные файлы выбирать в Files.
проблема найти ноду типа text непосредственно перед нужным Group
Я затупил, функция text() — вроде как возвращает чисто текст узла, как строку, а мне нужно было node(). При использовании text() все перепробованные онлайн экзекьюторы либо ругались, либо пустоту возвращали.
С node() мой парсер отрабатывал и раньше, только возвращал предыдущий именно что тэг, игнорируя узлы атрибутов, текстовые узлы и тп. Пришлось немного допилить, старое поведение оставил как есть опцию, работающую с установленным флагом (благо нигде в таком виде не использовал вроде), а новое поведение, которое все узлы хавает, сделал по дефолту. Вроде работает, всем спасибо
Здравствуйте, Marty, Вы писали:
M>>Сабж, собственно. M>Нашел ничегошный онлайн тестер XPath выражений — http://www.utilities-online.info/xpath/ M>Мой сэмпл — /Project/Targets/Target/Groups/Group[string(GroupName)='github_misc_stm32_meekdai_stm32_grbl']/preceding-sibling::node() — работает норм M>Я затупил, функция text() — вроде как возвращает чисто текст узла, как строку, а мне нужно было node(). При использовании text() все перепробованные онлайн экзекьюторы либо ругались, либо пустоту возвращали. M>С node() мой парсер отрабатывал и раньше, только возвращал предыдущий именно что тэг, игнорируя узлы атрибутов, текстовые узлы и тп. Пришлось немного допилить, старое поведение оставил как есть опцию, работающую с установленным флагом (благо нигде в таком виде не использовал вроде), а новое поведение, которое все узлы хавает, сделал по дефолту. Вроде работает, всем спасибо
Что-то странно. text() — матчит узлы с типом "текст", а node() — все узлы. "Чисто текст" — это функция string().
Попробовал этот онлайн тестер для
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Marty, Вы писали:
M>>>Сабж, собственно. M>>Нашел ничегошный онлайн тестер XPath выражений — http://www.utilities-online.info/xpath/ M>>Мой сэмпл — /Project/Targets/Target/Groups/Group[string(GroupName)='github_misc_stm32_meekdai_stm32_grbl']/preceding-sibling::node() — работает норм M>>Я затупил, функция text() — вроде как возвращает чисто текст узла, как строку, а мне нужно было node(). При использовании text() все перепробованные онлайн экзекьюторы либо ругались, либо пустоту возвращали. M>>С node() мой парсер отрабатывал и раньше, только возвращал предыдущий именно что тэг, игнорируя узлы атрибутов, текстовые узлы и тп. Пришлось немного допилить, старое поведение оставил как есть опцию, работающую с установленным флагом (благо нигде в таком виде не использовал вроде), а новое поведение, которое все узлы хавает, сделал по дефолту. Вроде работает, всем спасибо ·>Что-то странно. text() — матчит узлы с типом "текст", а node() — все узлы. "Чисто текст" — это функция string().
Значит, я неправильно спецификацию XPath 1.0 вычитал, когда писал парсер. У меня text() выдает текст, а при тесте я что-то напутал
Здравствуйте, Marty, Вы писали:
M>·>Что-то странно. text() — матчит узлы с типом "текст", а node() — все узлы. "Чисто текст" — это функция string(). M>Значит, я неправильно спецификацию XPath 1.0 вычитал,
Нет, это так называемый Node Test https://www.w3.org/TR/1999/REC-xpath-19991116/#node-tests
M>когда писал парсер. У меня text() выдает текст, а при тесте я что-то напутал
Я не понял — парсер чего? У тебя самодельная имплементация xpath что-ли?!
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: А про XPath вопросы в какой форум задавать?
Здравствуйте, ·, Вы писали:
M>>·>Что-то странно. text() — матчит узлы с типом "текст", а node() — все узлы. "Чисто текст" — это функция string(). M>>Значит, я неправильно спецификацию XPath 1.0 вычитал, ·>Нет, это так называемый Node Test https://www.w3.org/TR/1999/REC-xpath-19991116/#node-tests
Хм, странно, то ли я что-то другое читал, то ли не так вычитал
Давно дело было
M>>когда писал парсер. У меня text() выдает текст, а при тесте я что-то напутал ·>Я не понял — парсер чего? У тебя самодельная имплементация xpath что-ли?!