Обертывание XML-элемента с его родительскими узлами / тегами

Я не могу перемещаться по XML-документу программно, и мне нужно однострочное решение XPath по причинам, которые я описываю в конце.

Я работаю со схемой 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>

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

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

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

Некоторые другие соображения:

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

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


person Patrick    schedule 08.02.2011    source источник
comment
Как указано в теге wiki для xpath (также взятом из спецификации): Основная цель XPath - адресовать части XML-документа Он не сериализует новый документ , противоположность XQuery и XSLT.   -  person    schedule 09.02.2011
comment
Хороший вопрос, +1. См. В моем ответе объяснение, почему это нельзя сделать только с помощью XPath.   -  person Dimitre Novatchev    schedule 09.02.2011
comment
Спасибо, Алехандро. Ваш ответ и ответ Дмитрия помогли мне понять, что нам понадобится другой подход к этой проблеме.   -  person Patrick    schedule 09.02.2011


Ответы (1)


XPath - это язык запросов.

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

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

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

person Dimitre Novatchev    schedule 08.02.2011
comment
Спасибо, Димитр. Я вижу, что в этом случае мы не можем использовать решение XPath. - person Patrick; 09.02.2011
comment
Я должен сказать, что в этом случае нельзя использовать решение XPath only. Спасибо еще раз. - person Patrick; 09.02.2011