2010-06-09 3 views
2

를 검색 할 수 있습니다 :XPath 식 그래서, 내가 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() 

답변

3

XPATH 1.0은 제공하는 형식의 날짜를 지원하지 않습니다. 당신은 17,871,207 이러한 날짜의 숫자 표현을 사용할 수 있다면 당신은 쉽게과 같이 그것을 할 수 :

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

을이 다음은 xs:dateDATEOFSTATEHOOD 노드의 형식을 시도 가치가있을 수도 있습니다 가능하지 않은 경우 그리고 같은 것을 수행 :

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

구문이 정확하지 않을 수 있지만 잘하면 당신을 시작할 수 있습니다.

+0

이를 실행할 수 있습니다, 그래서 것 그렇게 해봐. 고마워. – gkrogers

+0

당신의 표현은 온라인 표현 테스터에서 작동하지만 Microsoft의 XML 라이브러리에서는 작동하지 않는 것으로 나타났습니다. 그러나 그것을 // STATES/STATE [(DATEOFSTATEHOOD)]/CAPITAL/text()로 변경하면 tritck가 실행됩니다 - 감사합니다! – gkrogers

1

당신은 그들이 XS로 포맷 할 수 있습니다 : 날짜를?

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 서버에서 완료되었지만 모든 표준 사항이라고 생각합니다.

1

당신은 XQuery를 날짜를 포맷하고 빠른 날짜 찾습니다 분()를 사용할 수 있습니다

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 sandbox