2015-11-04 68 views
1

我還沒有發現類似的線程解決方案,所以我希望有人能幫助我。我有XML如下(節選):的XPath CONCAT同級的所有節點匹配

<root> 
<identificationInfo> 
<MD_DataIdentification> 
<descriptiveKeywords> 
      <MD_Keywords> 
       <keyword> 
        <gco:CharacterString>Atmospheric conditions</gco:CharacterString> 
       </keyword> 
       <type> 
        <MD_KeywordTypeCode codeListValue="theme"/> 
       </type> 
      </MD_Keywords> 
     </descriptiveKeywords> 
     <descriptiveKeywords> 
      <MD_Keywords> 
       <keyword> 
        <gco:CharacterString>Agriculture</gco:CharacterString> 
       </keyword> 
       <keyword> 
        <gco:CharacterString>Biodiversity</gco:CharacterString> 
       </keyword> 
       <type> 
        <MD_KeywordTypeCode codeListValue="socialBenefitArea"/> 
       </type> 
      </MD_Keywords> 
     </descriptiveKeywords> 

我想是連接類型和關鍵字的字符串,所以我獲取列表看起來像以下:

theme:Atmospheric conditions 
socialBenefitArea:Agriculture 
socialBenefitArea:Biodiversity 

我嘗試了以下解決方案(XPath 1.0或XPath 2.0都可以使用),但始終只有第一個匹配的「主題:大氣條件」返回。

  • for $n in /*/gmd:identificationInfo/*/gmd:descriptiveKeywords/gmd:MD_Keywords return string-join(($n/gmd:type/*/@codeListValue, ':', $n/gmd:keyword/*/text()), '')
  • /*/gmd:identificationInfo/*/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/concat(*/text(), ':', ../gmd:type/*/@codeListValue)
  • //gmd:descriptiveKeywords/*/string-join((gmd:type/*/@codeListValue, gmd:keyword/*/text()[1]), ':')
  • //gmd:descriptiveKeywords/*/gmd:keyword/concat(following-sibling::gmd:type/*/@codeListValue, ':', ./*/text())

如果XPath的看起來是正確的,我在Java中與Saxon-HE 9.x這樣做。

我沒查出是評估返回一個字符串,而不是一個NODESET,我可能需要有多個結果。哪個XPath會返回一個NODESET?

感謝您的幫助!

回答

0

中的XPath 2.0表達式//gco:CharacterString/concat(ancestor::MD_Keywords/type/MD_KeywordTypeCode/@codeListValue, ':', .)返回(http://xsltransform.net/6r5Gh2U)三串

theme:Atmospheric conditions 
socialBenefitArea:Agriculture 
socialBenefitArea:Biodiversity 

的順序,我不明白爲什麼你問設置爲XPath 2.0中的一個節點不返回節點集,但節點,而序列或原始值。當你的結果不會在節點包含但要連接包含在不同節點串,我怎麼看不到輸入選擇的節點會有所幫助,如果你想,那麼你需要XSLT或XQuery創建新的節點。

0

我懷疑有關字符串和節點集混淆的來源,因爲你正在使用JAXP API,它是專爲XPath 1.0和不允許利用XPath 2.0中的充分的靈活性。如果你想從你的XPath表達式返回一個字符串的序列,如@馬丁Honnen建議,那麼你將需要使用s9api API來代替:這個處理完整的XPath 2.0數據模型。您可以繞過這個限制使用JAXP和節點集的結果,因爲XPath不允許你創建新的節點(只選擇現有節點),你想不符合現有節點串不了。然而,如果你真的被約束到JAXP,那麼你可以通過使用string-join()函數和一些合適的分隔符(例如換行符)來改變查詢來將結果組合成單個字符串,並且通過在調用Java代碼中進行標記,將它重新分成多個結果。

0

只需使用

/*/*/*/*/MD_Keywords/keyword/*/concat(../../type/*/@codeListValue, ': ', .) 

其中的XPath會返回一個NODESET?

Xpath 3。0表達式可以通過使用標準函數產生節點(-set),例如parse-xml()parse-xml-fragment()

相關問題