Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 将秒转换为持续时间XPATH_Xml_Xpath - Fatal编程技术网

Xml 将秒转换为持续时间XPATH

Xml 将秒转换为持续时间XPATH,xml,xpath,Xml,Xpath,如何将以秒为单位的时间转换为持续时间字符串,例如: 2 Days 10 Hours 10 Seconds 您不能直接使用XML和XPath来实现这一点,这正是您的问题所暗示的。但是,假设您仅限于使用XML技术,可以使用XSL: <xsl:template name="duration"> <xsl:param name="seconds" /> <xsl:choose> <xsl:when test="number($seconds)

如何将以秒为单位的时间转换为持续时间字符串,例如:

2 Days 10 Hours 10 Seconds

您不能直接使用XML和XPath来实现这一点,这正是您的问题所暗示的。但是,假设您仅限于使用XML技术,可以使用XSL:

<xsl:template name="duration">
  <xsl:param name="seconds" />
  <xsl:choose>
    <xsl:when test="number($seconds) >= 86400">
      <xsl:value-of select="floor(number($seconds) div 86400)" />
      <xsl:text> day(s) </xsl:text>
      <xsl:call-template name="duration">
        <xsl:with-param name="seconds" select="number($seconds) mod 86400" />       
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="number($seconds) >= 3600">
      <xsl:value-of select="floor(number($seconds) div 3600)" />
      <xsl:text> hour(s) </xsl:text>
      <xsl:call-template name="duration">
        <xsl:with-param name="seconds" select="number($seconds) mod 3600" />
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="number($seconds) >= 60">
      <xsl:value-of select="floor(number($seconds) div 60)" />
      <xsl:text> minute(s) </xsl:text>
      <xsl:call-template name="duration">
        <xsl:with-param name="seconds" select="number($seconds) mod 60" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="number($seconds)" />
      <xsl:text> second(s) </xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

XSLT2.0有idiv,因此您可以不使用地板..

您不能直接使用XML和XPath来实现这一点,这正是您的问题所建议的。但是,假设您仅限于使用XML技术,可以使用XSL:

<xsl:template name="duration">
  <xsl:param name="seconds" />
  <xsl:choose>
    <xsl:when test="number($seconds) >= 86400">
      <xsl:value-of select="floor(number($seconds) div 86400)" />
      <xsl:text> day(s) </xsl:text>
      <xsl:call-template name="duration">
        <xsl:with-param name="seconds" select="number($seconds) mod 86400" />       
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="number($seconds) >= 3600">
      <xsl:value-of select="floor(number($seconds) div 3600)" />
      <xsl:text> hour(s) </xsl:text>
      <xsl:call-template name="duration">
        <xsl:with-param name="seconds" select="number($seconds) mod 3600" />
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="number($seconds) >= 60">
      <xsl:value-of select="floor(number($seconds) div 60)" />
      <xsl:text> minute(s) </xsl:text>
      <xsl:call-template name="duration">
        <xsl:with-param name="seconds" select="number($seconds) mod 60" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="number($seconds)" />
      <xsl:text> second(s) </xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

XSLT 2.0具有idiv,因此您可以取消下限。

如果您不介意在输出中看到零,可以使用整数除法和模运算将值分隔为小时、分钟、秒和天:

秒数是模60的输入值。除了二手货,什么都扔掉

分钟数是输入值除以60,截断为整数,然后取模60。将秒重新缩放为分钟,丢弃除分针以外的所有东西

小时数是输入值除以3600 60*60,截断为整数,然后取模24。将秒重新缩放为小时等

天数。。。你现在应该看到这个模式了。。。除以86400 24*60*60并截断为整数。既然我们不打算把它分成几个月和几年,我们就到此为止

未经测试但应有效:

concat(floor($NUMSEC div 86400),' Days ',floor($NUMSEC div 3600) mod 24,' Hours ',
  floor($NUMSEC div 60) mod 60,' Minutes ',$NUMSEC mod 60,' Seconds'
其中,$NUMSEC是包含总秒数的XPath变量或返回该整数的XPath表达式。是的,后者效率很低,但这正是作为一个表达式尝试这样做的结果

如果要禁止显示为零的部分,并完全在XPath 1.0中执行此操作。。。我认为这是可能的,但坦率地说,这比我想处理的更丑陋,所以我把它留给读者作为练习

XPath 2.0将Duration识别为数据类型,并具有访问Duration组件的函数,因此这是另一个选项。要将整数转换为持续时间,请将其乘以隐含的时间单位,例如PTS1

然而:可能并不等于好主意。也许,除非有理由必须在XPath中这样做,以使其作为更通用的宏语言运行?我通常建议只使用XPath检索值,并使用启动XPath的任何语言进行转换


如果您真的需要一种能够很好地格式化数据以及从XML中检索数据的表达式语言,我建议您看看是否可以使用XQuery。从某种意义上说,XQuery是XPath 2.0的超集,它添加了与XSLT 2.0相同的大部分功能,尽管是以查询表达式的形式而不是XML语法的形式。如果您不介意在输出中看到零,可以使用整数除法和模运算将值分为小时、分钟、秒和天:

秒数是模60的输入值。除了二手货,什么都扔掉

分钟数是输入值除以60,截断为整数,然后取模60。将秒重新缩放为分钟,丢弃除分针以外的所有东西

小时数是输入值除以3600 60*60,截断为整数,然后取模24。将秒重新缩放为小时等

天数。。。你现在应该看到这个模式了。。。除以86400 24*60*60并截断为整数。既然我们不打算把它分成几个月和几年,我们就到此为止

未经测试但应有效:

concat(floor($NUMSEC div 86400),' Days ',floor($NUMSEC div 3600) mod 24,' Hours ',
  floor($NUMSEC div 60) mod 60,' Minutes ',$NUMSEC mod 60,' Seconds'
其中,$NUMSEC是包含总秒数的XPath变量或返回该整数的XPath表达式。是的,后者效率很低,但这正是作为一个表达式尝试这样做的结果

如果要禁止显示为零的部分,并完全在XPath 1.0中执行此操作。。。我认为这是可能的,但坦率地说,这比我想处理的更丑陋,所以我把它留给读者作为练习

XPath 2.0将Duration识别为数据类型,并具有访问Duration组件的函数,因此这是另一个选项。要将整数转换为持续时间,请将其乘以隐含的时间单位,例如PTS1

然而:可能并不等于好主意。也许,除非有理由必须在XPath中这样做,以使其作为更通用的宏语言运行?我通常建议只使用XPath检索值,并使用启动XPath的任何语言进行转换

如果您真的需要一种能够很好地格式化数据以及从XML中检索数据的表达式语言,我建议您看看是否可以使用XQuery。从某种意义上说,XQuery是XPath2.0的超集,它添加了与XSLT2.0相同的大部分功能,尽管是以QueryExpress的形式
您确实需要说明是使用XPath 1.0还是2.0,答案将完全不同

在XPath2.0中,可以使用

$seconds * xs:dayTimeDuration('PT1S')
days-from-duration($d)
hours-from-duration($d)
然后,您可以使用

$seconds * xs:dayTimeDuration('PT1S')
days-from-duration($d)
hours-from-duration($d)

等等。

您确实需要说明您是在使用XPath 1.0还是2.0——答案将非常不同

在XPath2.0中,可以使用

$seconds * xs:dayTimeDuration('PT1S')
days-from-duration($d)
hours-from-duration($d)
然后,您可以使用

$seconds * xs:dayTimeDuration('PT1S')
days-from-duration($d)
hours-from-duration($d)

等等。

您将如何手动完成?老实说,我不知道。您将很难在纯XPath中完成此操作,当然我看不出您在XPath 1.0中如何完成此操作,尽管它在2.0中可能是可行的。您使用什么工具/库/编程语言来评估XPath,以及它支持什么版本的XPath?您将如何手动完成?老实说,我不知道。您将很难在纯XPath中完成这项工作,当然我看不出您在XPath 1.0中如何完成,尽管它在2.0中可能是可行的。您使用什么工具/库/编程语言来评估XPath以及它支持什么版本的XPath?我没有找到将原始数字转换为持续时间的简单方法—只需将数字乘以单位持续时间,如PT1S.Ah。我没有考虑是否支持持续时间数学。那太明显了。。。。谢谢,迈克。我没有找到一个简单的方法把一个原始数字转换成一个持续时间——只需将这个数字乘以一个单位持续时间,比如PT1S。我没有考虑是否支持持续时间数学。那太明显了。。。。谢谢,迈克。