1

我的 XML 文件是这样的:

<element id="1" time="05-08-2012T12:00">...</element>
<element id="2" time="05-08-2012T13:00">...</element>
<element id="3" time="05-08-2012T14:00">...</element>
...
<element id="13" time="06-08-2012T00:00">...</element>
<element id="14" time="06-08-2012T01:00">...</element>

现在我想做的是:

  • 创建一个仅包含不同日期的 HTML 选项框。我试过这个:

//mesure/@date 中的 $d

对于子字符串中的 $date($d,0,11)

返回不同的值($日期)

但它一直返回“05-08-2012”的次数与在 XML 文件中打印的次数一样多。

  • 我还想知道如何更改我在 HTML 选项框中输入的值(例如“05-08-2012”将变为“2012 年 8 月 5 日”)。应该使用函数吗?

  • 最后,我想保留包含给定日期的第一个元素的 id,这样当我在 HTML 选择框中选择它时,我可以使用该日期的所有元素。

4

3 回答 3

3

使用

distinct-values(//measure/@date/substring-before(.,'T'))

要获得完整的所需结果,请使用

  let $months := ('January', 'February', 'March', 'April', 'May', 'June', 'July',
                  'August', 'September', 'October', 'November', 'December'),
    $dates := distinct-values(//measure/@date/substring-before(.,'T'))
 return
    for $date in $dates,
        $d in tokenize($date, '-')[1],
        $m in xs:integer(tokenize($date, '-')[2]),
        $y in tokenize($date, '-')[3]
     return
        ($d, $months[$m], $y, '&#xA;')

将此 XQuery 应用于以下 XML 文档的结果

<t>
    <measure id="1" date="05-08-2012T12:00">...</measure>
    <measure id="2" date="05-08-2012T13:00">...</measure>
    <measure id="3" date="05-08-2012T14:00">...</measure>
...
    <measure id="13" date="06-08-2012T00:00">...</measure>
    <measure id="14" date="06-08-2012T01:00">...</measure>
</t>

 05 August 2012 
 06 August 2012 
于 2012-12-17T18:02:39.513 回答
1

那是因为如果你对 $date 应用 distinct-values,$date 只有一个值(并且一个值总是不同的)。您需要将其应用于整个序列,即

 distinct-values( for $d in //mesure/@date return  substring($d,0,11) )

要更改日期,最好使用 tokenize 函数来拆分组件,然后重新排序。

let $splitDate := tokenize("05-08-2012", "-"), $monthNames := ("January", "February" , ...) 
return concat($splitDate[1] cast as integer, " ", $monthNames[$splitDate[2] cast as integer], " ", $splitDate[3])

您可以尝试 xs:date(..) 将日期读取为真实日期,然后使用 XQuery 日期函数打印它,但是您输入的日期的组件顺序错误,因此 XQuery 可能无法解析它。 .

于 2012-12-17T17:40:46.077 回答
-1

您需要在序列上获得不同的值:

distinct-values(//mesure/@date/substring(.,0,11))

可以使用fn:format-dateTimexs:dateTime 值格式化日期:

format-dateTime($d, "[D] [MNn] [Y]")
=> 5 August 2012

对于您的最后一个问题,您需要更具体地说明您希望对这些元素的 ID 做什么,并提供有关此数据的更多信息。(这可能应该是一个单独的问题)

于 2012-12-17T17:45:20.523 回答