2012-06-14 36 views
0

我有以下DTD:的XQuery月功能

<!DOCTYPE guests [ 
<!ELEMENT Guest (Gname, youth+, car+)> 
<!ELEMENT youth (Yname, dateofbirth)> 
<!ELEMENT car (carType, excursion+)> 
<!ELEMENT excursion (week, location)> 
<!ELEMENT Gname (#PCDATA)> 
<!ELEMENT Yname (#PCDATA)> 
<!ELEMENT dateofbirth (#PCDATA)> 
<!ELEMENT carType (#PCDATA)> 
<!ELEMENT week (#PCDATA)> 
<!ELEMENT location (#PCDATA)> 
>] 

,我想使用XQuery找到誰擁有青春的生日是八月所有客人的名字。這就是我想出了:

for $x in Guest/youth 
let $GuessN := $x/@Gname 
where $x/month:=8 
return <Gname> $GuessN </Gname> 

For $x in Guest/youth[month=8] 
Return <Gname>$x/@Gname </Gname> 

沒有任何函數讀取月?

+2

根據您的DTD元素'youth'沒有一個孩子'month'其中您的XPath的暗示。你是否試圖從'dateofbirth'中提取月份?如果是這樣,(xs:dateTime)中的日期格式是什麼? –

回答

1

如果您想查詢當月的youth/dateofbirth(見上面我的意見),你可以使用:

month-from-date()如果dateofbirthxs:date
month-from-dateTime()如果dateofbirth是XS的xs:dateTime

例子:日期:                2012-06-14XS的 例子:日期時間:  2012-06-14T22:34:52.682-06:00

如果dateofbirth澆注料爲XS:日期或XS:DATETIME,你必須手動提取月份(最有可能使用tokenize())。

以下是使用month-from-date()的示例。我必須添加元素聲明guests,我必須正確關閉內部子集(]>而不是>])。

XML輸入

<!DOCTYPE guests [ 
<!ELEMENT guests (Guest+)> 
<!ELEMENT Guest (Gname, youth+, car+)> 
<!ELEMENT youth (Yname, dateofbirth)> 
<!ELEMENT car (carType, excursion+)> 
<!ELEMENT excursion (week, location)> 
<!ELEMENT Gname (#PCDATA)> 
<!ELEMENT Yname (#PCDATA)> 
<!ELEMENT dateofbirth (#PCDATA)> 
<!ELEMENT carType (#PCDATA)> 
<!ELEMENT week (#PCDATA)> 
<!ELEMENT location (#PCDATA)> 
]> 
<guests> 
    <Guest> 
     <Gname>Guest 1</Gname> 
     <youth> 
      <Yname>Youth A</Yname> 
      <dateofbirth>2012-06-14</dateofbirth> 
     </youth> 
     <car> 
      <carType/> 
      <excursion> 
       <week/> 
       <location/> 
      </excursion> 
     </car> 
    </Guest> 
    <Guest> 
     <Gname>Guest 2</Gname> 
     <youth> 
      <Yname>Youth B</Yname> 
      <dateofbirth>2012-08-14</dateofbirth> 
     </youth> 
     <car> 
      <carType/> 
      <excursion> 
       <week/> 
       <location/> 
      </excursion> 
     </car> 
    </Guest> 
    <Guest> 
     <Gname>Guest 3</Gname> 
     <youth> 
      <Yname>Youth C</Yname> 
      <dateofbirth>2000-12-25</dateofbirth> 
     </youth> 
     <car> 
      <carType/> 
      <excursion> 
       <week/> 
       <location/> 
      </excursion> 
     </car> 
    </Guest> 
</guests> 

的XQuery

<guests> 
{ 
for $guest in /guests/Guest[month-from-date(youth/dateofbirth) = 8] 
    return $guest/Gname 
} 
</guests> 

XML輸出

<guests> 
    <Gname>Guest 2</Gname> 
</guests> 

真的中的XQuery可能只是減少:

<guests>{/guests/Guest[month-from-date(youth/dateofbirth) = 8]/Gname}</guests>