2

私はXMLスニペットを持っているので、次のようになります。

<STATES>
  <STATE>
    <NAME>Alabama</NAME>
    <ABBREVIATION>AL</ABBREVIATION>
    <CAPITAL>Montgomery</CAPITAL>
    <POPULATION>4661900</POPULATION>
    <AREA>52419</AREA>
    <DATEOFSTATEHOOD>14 December 1819</DATEOFSTATEHOOD>
  </STATE>
  <STATE>
    <NAME>Alaska</NAME>
    <ABBREVIATION>AK</ABBREVIATION>
    <CAPITAL>Juneau</CAPITAL>
    <POPULATION>698473</POPULATION>
    <AREA>663268</AREA>
    <DATEOFSTATEHOOD>1 January 1959</DATEOFSTATEHOOD>
  </STATE>
  <STATE>
    <NAME>Delaware</NAME>
    <ABBREVIATION>DE</ABBREVIATION>
    <CAPITAL>Dover</CAPITAL>
    <POPULATION>885122</POPULATION>
    <AREA>2490</AREA>
    <DATEOFSTATEHOOD>7 December 1787</DATEOFSTATEHOOD>
  </STATE>
</STATES>
<etc, etc.>

(たとえば)最も古い州の首都(つまり「ドーバー」)を取得したいと思います。私はここまで到達することができました:

//STATES/STATE[DATEOFSTATEHOOD='7 December 1787']/CAPITAL/text()

しかし、「DATEOFSTATEHOOD={最も早いDATEOFSTATEHOOD}」と言う方法を理解することはできません。

誰かが私を正しい方向に向けることができますか?

解決策:マットの解決策は多かれ少なかれ的を射ています。指摘されたように、Xpath 1.0は使用していた日付形式をサポートしていないため、日付を再形式化する必要がありました(YYYYMMDDDを使用しました)。また、MicrosoftのXMLライブラリ(4.0および6.0)は、Mattの式を含むノードリスト全体を返しました。テストを逆にすると、その問題が修正され、最も古いノードだけが返されるようになりました。

それで:

//STATES/STATE[(DATEOFSTATEHOOD < //STATES/STATE/DATEOFSTATEHOOD)]/CAPITAL/text()
4

3 に答える 3

3

XPATH 1.0は、提供している形式の日付をサポートしていません。17871207など、これらの日付の数値表現を使用できた場合は、次のように簡単に行うことができます。

//STATES/STATE[not(DATEOFSTATEHOOD > //STATES/STATE/DATEOFSTATEHOOD)]/CAPITAL/text()

これが実行可能でない場合は、DATEOFSTATEHOODノードをとしてフォーマットxs:dateして同じことを実行することをお勧めします。

//STATES/STATE[not(xs:date(DATEOFSTATEHOOD) > xs:date(//STATES/STATE/DATEOFSTATEHOOD))]/CAPITAL/text()

構文は完全に正しいわけではないかもしれませんが、うまくいけば、それで始められるでしょう。

于 2010-06-09T18:07:51.377 に答える
1

それらをxs:datesに再フォーマットできますか?

let $dates := (xs:date('2000-10-23'), xs:date('1999-12-26'))
let $min := fn:min($dates)
let $max := fn:max($dates)
return $min

MarkLogicサーバーで実行されますが、これはすべて標準的なものだと思います。

于 2010-06-09T17:58:41.000 に答える
1

XQueryを使用して日付を再フォーマットし、min()を使用して最も早い日付を見つけることができます。

declare variable $monthnames := ("January","February","March","April","May","June","July","August","September","October","November","December");

declare function local:pad-zero($s as xs:string) as xs:string {
  if (string-length($s) = 1) then concat("0",$s) else $s
};

declare function local:df ($d as xs:string) as xs:date {
  let $dp := tokenize($d," ")
  let $year := $dp[3]
  let $month := local:pad-zero(string(index-of($monthnames,$dp[2])))
  let $day := local:pad-zero($dp[1])
  return
    concat($year,"-",$month,"-",$day)


};

let $states := 
<STATES>
  <STATE>
    <NAME>Alabama</NAME>
    <ABBREVIATION>AL</ABBREVIATION>
    <CAPITAL>Montgomery</CAPITAL>
    <POPULATION>4661900</POPULATION>
    <AREA>52419</AREA>
    <DATEOFSTATEHOOD>14 December 1819</DATEOFSTATEHOOD>
  </STATE>
  <STATE>
    <NAME>Alaska</NAME>
    <ABBREVIATION>AK</ABBREVIATION>
    <CAPITAL>Juneau</CAPITAL>
    <POPULATION>698473</POPULATION>
    <AREA>663268</AREA>
    <DATEOFSTATEHOOD>1 January 1959</DATEOFSTATEHOOD>
  </STATE>
  <STATE>
    <NAME>Delaware</NAME>
    <ABBREVIATION>DE</ABBREVIATION>
    <CAPITAL>Dover</CAPITAL>
    <POPULATION>885122</POPULATION>
    <AREA>2490</AREA>
    <DATEOFSTATEHOOD>7 December 1787</DATEOFSTATEHOOD>
  </STATE>
</STATES>


return 
   $states//STATE
     [local:df(DATEOFSTATEHOOD) = 
      min($states//STATE/local:df(DATEOFSTATEHOOD))
     ]

これはeXistサンドボックスで実行できます

于 2010-06-11T05:56:25.900 に答える