我有以下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语句的最佳选择吗?
答案 0 :(得分:1)
单独使用XPath 1.0是不可能的。
您可以使用谓词来测试 node 值,例如:
Duration/DurationUTC[boolean(floor(Duration/DurationUTC div 8640))]
当floor
求值为零时,这将返回一个空节点集,该节点集将转换为concat
中的空字符串。但你无法使用D
字符串做类似的事情。结果会更糟D, h, 10min, 0 sec
。
如果您可以控制源文档,并且可以将字符串D
,h
作为文本节点存储在源中,则可以使用谓词来选择它们。例如,如果您的来源具有以下内容:
<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'
)