2011-02-08 3 views
1

Я рассмотрел ранее заданные вопросы о stackoverflow, а также в ссылках и учебниках XPath, но я не вижу ничего, что вполне соответствует моему сценарию. Извините заранее, если это уже было задано или если есть тривиальный ответ, который я как-то пропустил. (Кроме того, я упрощаю ситуацию, чтобы сделать ее более понятной. Главное здесь, что я не могу ориентироваться в XML-документе программно и нуждаться в однострочном решении XPath по причинам, которые я описываю в конце.)Обтекание XML-элемента с его узлами-предками/тегами

Я работаю с XML-схемой, которая выглядит примерно так, как показано ниже. (Это то, что я должен использовать как есть.)

<Root> 
    <!-- Child 1 --> 
    <Child> 
     <Name>Joe</Name> 
     <Age>12</Age> 
    </Child> 
    <!-- Child 2 --> 
    <Child> 
     <Name>Mike</Name> 
     <Age>25</Age> 
    </Child> 
    <!-- Child 3 --> 
    <Child> 
     <Name>Jane</Name> 
     <Age>20</Age> 
    </Child> 
</Root> 

Предполагая, что я уже в узле «Джо» (т.е. имя элемента внутри ребенка 1), мне нужно, чтобы определить запрос XPath, который будет «обернуть» этот узел следующим образом:

<Root> 
    <!-- Child 1 --> 
    <Child> 
     <Name>Joe</Name> 
     <Age>12</Age> 
    </Child> 
</Root> 

Я пробовал различные комбинации предка, струнно-соединения, CONCAT и т.д., но не могу показаться, чтобы найти решение, которое «заворачивает» элемент правильно. (Способ, которым я пользовался предком, возвращал все Ребенок-узлы, например, который мне не нужен.)

Некоторые другие соображения: (1) Решение должно быть однострочным запросом XPath, если это возможно (по причинам, приведенным ниже). (2) Он должен быть достаточно общим для работы для любого дочернего элемента (т. Е. Он не может считать, что я всегда на первом, втором или третьем ребенке, например). (3) Из приведенного выше примера вы можете видеть, что мне фактически не нужен фактический корневой узел per se, просто его тег (т. Е. Я не хочу, чтобы все дочерние узлы находились под ним). Однако мне нужен фактический дочерний узел (так что я получаю имя и возраст).

ПРИМЕЧАНИЕ. Для чего это действительно важно, я не могу программно использовать XML. Я использую библиотеку (код которой я не могу изменить), в которой я должен определить все в терминах однострочных запросов XPath в файле конфигурации. Он по существу будет перемещаться по всем элементам Name, поэтому мое решение должно работать с этой точки.

Заранее спасибо.

+0

Как указано в теге wiki для 'xpath' (также взятом из спецификаций): * Основная цель XPath - обращение к частям XML-документа * ** Он не сериализует новый документ **, противоположный XQuery и XSLT. –

+0

Хороший вопрос, +1. См. Мой ответ для объяснения, почему это невозможно сделать с помощью XPath. –

+0

Спасибо, Алехандро. Ваш ответ и Димитрий помогли мне понять, что нам понадобится другой подход к этой проблеме. – Patrick

ответ

1

XPath является запросом Язык.

Это, между прочим, означает, что оценка выражения XPath никогда не изменяет XML-документ.

Итак, ответ: Изменение документа XML или создать новый документ не может быть сделано с помощью только XPath.

Такие преобразования очень просты и естественны для определения с помощью XSLT.

+0

Спасибо, Димитр. Я вижу, что мы не можем использовать решение XPath в этом случае. – Patrick

+0

Я должен сказать: «В этом случае нельзя использовать только решение XPath *». Еще раз спасибо. – Patrick

 Смежные вопросы

  • Нет связанных вопросов^_^