2011-05-12 42 views
2

我有以下XML:如何找到嵌套在兩個不同標籤中的兩個同名節點的位置?

<employees> 
    <employee> <!--forgot to include an attribute--> 
     <name>John</name> 
     <jobs> 
      <job>Writer</job> 
      <job>Artist</job> 
    </jobs> 
    </employee> 
    <employee> 
     <name>John</name> 
     <jobs> 
      <job>Engineer</job> 
      <job>Editor</job> 
    </jobs> 
    </employee> 
</employees> 

如果我想要得到的人從事的工作與name =「約翰」 XPath返回屬於一個「約翰」的所有四份工作。我想要兩個不同的「約翰」每個人完成2 + 2個不同的工作。

我使用XPath表達式

"//employees/employee[name='John']/jobs/job/text()" 

是否有使用次數或其他一些功能來做到這一點在XPath的方式在Java?

+0

@@ Niranjani S:請你,編輯你的問題,並指定你想得到的確切結果是什麼 - 列出你想要得到的確切的XML節點。 – 2011-05-12 13:55:34

回答

0

無論在哪裏找到節點,XPath總是會返回一個平面列表,這就是爲什麼您只需獲得4段文本。如果你想按照它們的父節點對它們進行分組,你需要首先搜索Johns並且用這些結果做一個嵌套循環 - 對於每個John來說,爲該作業做一個XPath,從該節點開始。你希望如何用Java對它們進行分組取決於你 - 也許是字符串(名稱)映射到字符串(作業)列表。

+0

獲取名爲「John」的員工節點,然後使用getChildNodes()遍歷員工節點完成工作! – 2011-05-12 14:41:24

2

XPath是(僅)XML文檔的查詢語言 - 對XPath表達式的評估結果永遠不是修改的節點 - 單獨的XPath不會更改任何節點的結構和/或內容。

想要返回的內容被修改爲<employee>元素只有它們的<jobs>孩子,這不能用XPath單獨實現。

最接近你想要什麼是

/*/employee[name='John']/jobs 

這將選擇以下

<jobs> 
     <job>Writer</job> 
     <job>Artist</job> 
    </jobs> 
    <jobs> 
     <job>Engineer</job> 
     <job>Editor</job> 
    </jobs> 

我猜是你想要的結果,可以產生絕對好用通過此XSLT轉換

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/employee[name='John']/node()[not(self::comment())]"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變被應用到所提供的XML文檔

<employees> 
    <employee> 
     <!--forgot to include an attribute--> 
     <name>John</name> 
     <jobs> 
      <job>Writer</job> 
      <job>Artist</job> 
     </jobs> 
    </employee> 
    <employee> 
     <name>John</name> 
     <jobs> 
      <job>Engineer</job> 
      <job>Editor</job> 
     </jobs> 
    </employee> 
</employees> 

想要的,正確的結果產生

<name>John</name> 
<jobs> 
    <job>Writer</job> 
    <job>Artist</job> 
</jobs> 
<name>John</name> 
<jobs> 
    <job>Engineer</job> 
    <job>Editor</job> 
</jobs> 
+0

我是新來的XSLT ...原諒我... – 2011-05-12 13:23:46

+0

@Niranjani S:不要感到內疚 - 只需搭上旅行車即可。你不會後悔:) – 2011-05-12 13:53:12

相關問題