XQuery:如何获得不同的子串值?

时间:2012-12-17 17:32:13

标签: xml xquery

我的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选项框。我试过这个:
  

for $ d in // mesure / @ date

     

表示子字符串中的$ date($ d,0,11)

     

返回distinct-values($ date)

但它不断返回“05-08-2012”,就像在XML文件中打印一样多次。

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

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

3 个答案:

答案 0 :(得分:2)

使用

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;')

在以下XML文档上应用此XQuery的结果

<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 

答案 1 :(得分:1)

这是因为如果将distinct-values应用于$ date,则仅$ 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可能无法解析它...

答案 2 :(得分:-1)

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

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

可以使用xs:dateTime值上的fn:format-dateTime格式化日期:

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

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