如何使用XSL查询XML元素并返回结果?

时间:2015-05-18 22:34:09

标签: xml xslt

我有一个包含开始日期和结束日期的日期范围(期间)的XML列表。我需要查询列表并在找到匹配时返回Start元素(或位置),但我不确定如何实现此目的。

以下是示例数据:

<Calendar>
    <Period>
        <Start>20150501</Start>
        <End>20150514</End>
    </Period>
    <Period>
        <Start>20150515</Start>
        <End>20150531</End>
    </Period>
    <Period>
        <Start>20150601</Start>
        <End>201506014</End>
    </Period>
    <Period>
        <Start>20150615</Start>
        <End>201506030</End>
    </Period>
<Calendar>

我已经使用这个XPATH来查找我的输出,但是如何返回Start的元素值或者可能返回Position?

//Calendar/Period[Start <= '20150518' and End >= '20150518']

返回:

/Calendar[1]/Period[2]

我正在寻找输出为Start值或Position:来自我的示例'20150515'或2。

XML是来自Web服务调用的响应,因此我无权访问文件。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是半个答案,依赖于ubuntu的xmllint

xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/text()' 

返回

20150515

但最后不会有\n个字符。这意味着您的cmd行看起来像

20150515mPrompt >

(另请注意,当您实际指定完整路径时,在前面使用&#39; //&#39;通常会被真正的XMLSLT大师标记为SO,因为计算成本高且不需要。我有切换到/Calendar/...。并且不需要引用日期值,因此只需要20150518,而不是'20150518'(至少在xmllint中)。

我花了太多时间研究正确的语法来追加\n但却找不到它。我想这种行为被认为是XML-land中的一个特性。显然唯一的解决方案是黑客攻击。 IHMO,最容易理解的是

xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start' \
| sed 's@<[/]*Start>@@g;s/$/\n/'

生成

20150518

(我在一台机器上写这个并在另一台机器上测试)。

最后,如果,A。您在* nix shell脚本环境中执行此操作,并且您希望稍后使用该值,那么最简单的方法是使用cmd-substitution来捕获值进入shell变量,比如

startDate=$(xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/text()')

echo "my StartDate = ${startDate}'
my StartDate = 20150518

至于返回位置,我无法找到适用于xmllint的xpath函数。基于XML Cheetsheet的功能列表,我原本希望

xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/position()' 

工作,但只有

 XPath error : Invalid expresion
 xmlpathEval : evaluation failed
 XPath evaluation failure

欢迎其他人解释!

IHTH

答案 1 :(得分:-1)

您可以将XPATH用于此//Period[Start >= 20150501 and End <= 20150514]

试一试here