Xpath 用其祖先节点/标记包装XML元素

Xpath 用其祖先节点/标记包装XML元素,xpath,parent-child,ancestor,Xpath,Parent Child,Ancestor,我无法以编程方式浏览XML文档,出于我在最后描述的原因,我需要一个单行XPath解决方案 我正在使用一个类似于下面的XML模式。(这是我必须按原样使用的东西。) 乔 12 迈克 25 简 20 假设我已经在“Joe”节点(即子1中的Name元素),我需要定义一个XPath查询,该查询将“包装”该节点,如下所示: <Root> <!-- Child 1 --> <Child> <Name>Joe</Name>

我无法以编程方式浏览XML文档,出于我在最后描述的原因,我需要一个单行XPath解决方案

我正在使用一个类似于下面的XML模式。(这是我必须按原样使用的东西。)


乔
12
迈克
25
简
20
假设我已经在“Joe”节点(即子1中的Name元素),我需要定义一个XPath查询,该查询将“包装”该节点,如下所示:

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

乔
12
我尝试过祖先、字符串连接、concat等的各种组合,但似乎找不到正确“包装”元素的解决方案。(例如,我使用祖先的方式是返回所有子节点,这不是我所需要的。)

其他一些考虑:

  • 如果可能的话,解决方案必须是一行XPath查询(原因如下)
  • 它必须具有足够的通用性,以适用于任何子元素(例如,它不能假设我总是在第一个、第二个或第三个子元素)
  • 从上面的示例中,您可以看到我实际上并不需要实际的根节点本身,只需要它的标记(即,我不希望所有子节点都在它下面)。但是,我确实需要实际的子节点(以便获得名称和年龄) 注意:无论如何,我实际上无法以编程方式导航XML。我使用的是一个库(其代码我无法更改),在这个库中,我必须根据配置文件中的一行XPath查询来定义所有内容。它基本上会浏览所有的Name元素,因此我的解决方案必须从这一点开始工作。

    XPath是一种查询语言

    这意味着XPath表达式的计算永远不会修改XML文档

    因此,答案是:仅使用XPath无法修改XML文档或创建新文档

    用XSLT指定这样的转换非常简单和自然。

    XPath是一种查询语言

    这意味着XPath表达式的计算永远不会修改XML文档

    因此,答案是:仅使用XPath无法修改XML文档或创建新文档


    用XSLT指定这样的转换非常简单和自然。

    正如
    xpath
    的wiki标记所述(也取自规范):xpath的主要目的是处理XML文档的一部分,而不是序列化新文档,与XQuery和XSLT相反。好问题,+1。请参阅我的答案,了解为什么不能单独使用XPath来实现这一点。谢谢,Alejandro。您的回答和Dimitre帮助我意识到我们需要一种不同的方法来解决这个问题。正如
    xpath
    的wiki标记所述(也取自规范):xpath的主要目的是处理XML文档的一部分,它不会序列化新文档,与XQuery和XSLT相反。好问题,+1。请参阅我的答案,了解为什么不能单独使用XPath来实现这一点。谢谢,Alejandro。你的回答和Dimitre的帮助我意识到我们需要一种不同的方法来解决这个问题。谢谢,Dimitre。我发现在这种情况下我们不能使用XPath解决方案。我应该说“在这种情况下不能使用XPath唯一的解决方案。”再次感谢。谢谢,Dimitre。我发现在这种情况下我们不能使用XPath解决方案。我应该说“在这种情况下不能使用仅XPath的解决方案。”再次感谢。
    <Root>
      <!-- Child 1 -->
      <Child>
          <Name>Joe</Name>
          <Age>12</Age>
      </Child>
    </Root>