0

我有以下 DTD:

<!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>

有什么功能可以读取月份吗?

4

1 回答 1

1

如果您尝试检查月份youth/dateofbirth(请参阅我上面的评论),您可以使用:

month-from-date()如果dateofbirthxs:date
month-from-dateTime()如果dateofbirthxs:dateTime

xs:date        2012-06-14
示例: xs:dateTime 示例: 2012-06-14T22:34:52.682-06:00

如果dateofbirth可转换为 xs:date 或 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>
于 2012-06-15T04:47:20.297 回答