XPath - 将UTC转换为时间字符串[XPATH 1.0]

时间:2014-05-30 10:47:43

标签: xml xpath

我有以下xpath表达式将UTCTime转换为这种格式:1 D, 2h, 10 min, 10 sec

concat(floor(Duration/DurationUTC div 8640),' D ',floor(Duration/DurationUTC div 360) mod 24,' h ', floor(Duration/DurationUTC div 60) mod 60,' min ',Duration/DurationUTC mod 60,' sec')

如果结果是2小时,我会得到0 D, 0h, 10 min, 0 sec

问题是:如何在这种情况下隐藏0D and 0h并显示10 min, 0 sec

是IF语句的最佳选择吗?

1 个答案:

答案 0 :(得分:1)

单独使用XPath 1.0是不可能的。

您可以使用谓词来测试 node 值,例如:

Duration/DurationUTC[boolean(floor(Duration/DurationUTC div 8640))]

floor求值为零时,这将返回一个空节点集,该节点集将转换为concat中的空字符串。但你无法使用D字符串做类似的事情。结果会更糟D, h, 10min, 0 sec

如果您可以控制源文档,并且可以将字符串Dh作为文本节点存储在源中,则可以使用谓词来选择它们。例如,如果您的来源具有以下内容:

<labels>
    <day-label>D,</day-label>
    <hour-label>h,</hour-label>
</labels>

你可以使用

concat(Duration/DurationUTC [boolean(floor(Duration/DurationUTC div 8640))], //labels/day-label[boolean(floor(Duration/DurationUTC div 8640))])

不打印任何内容(如果floor结果为零)或10D,是否10

如果您支持XPath 2.0,则可以使用:

concat(
    if (/Duration/DurationUTC div 8640 > 1)  
         then concat(floor(/Duration/DurationUTC div 8640),' D ') 
         else '',
    if ((/Duration/DurationUTC div 360) mod 24 > 1)  
         then concat(floor(/Duration/DurationUTC div 360) mod 24,' h ') 
         else '',
    floor(/Duration/DurationUTC div 60) mod 60,' min ',
    /Duration/DurationUTC mod 60,' sec'
)