2011-02-08 90 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> 

假設我已經在「喬」節點,我需要定義一個XPath查詢,將(即內兒童1 Name要素) 「包裝」該節點如下:

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

我已經試過祖先的各種組合,串加入,CONCAT等,但似乎無法說,「包裝」的元素正確地找到解決方案。 (我使用的祖先的方式是返回所有子節點,例如,這不是我所需要的。)

其他注意事項:(1)解決方案必須是單行XPath查詢,if這是可能的(由於下面給出的原因)。 (2)它必須足夠通用,可以用於任何子元素(例如,它不能假定我總是處於第一或第二或第三個孩子)。 (3)從上面的例子中,你可以看到我實際上並不需要實際的Root節點,只是它的標籤(即我不希望所有的Child節點在它下面)。但是,我確實需要實際的子節點(以便獲得名稱和年齡)。

注:對於它的價值,我實際上無法以編程方式導航XML。我正在使用一個庫(其代碼無法更改),我必須根據配置文件中的單行XPath查詢來定義所有內容。它基本上會瀏覽所有的Name元素,所以我的解決方案必須從這一點開始。

在此先感謝。

+0

由於聲明`xpath`的wiki標籤(也取自規範):* XPath的主要目的是解決XML文檔的部分問題* **它不會序列化新文檔**,相反XQuery和XSLT。 – 2011-02-08 23:20:51

+0

好問題,+1。請參閱我的答案,瞭解爲什麼無法單獨使用XPath來完成此操作。 – 2011-02-08 23:52:14

回答

1

XPath是查詢語言

這意味着對XPath表達式的評估決不會修改XML文檔。

所以,答案是:修改XML文檔或創建一個新的文件不能使用的XPath來完成。

這樣的轉換非常容易和自然地用XSLT指定。

相關問題