2014-08-27 126 views

回答

4

使用XPath 1.0运营商divmod(与floor相结合)。为了说明,下面有一个XSLT 1.0样式表。细节取决于您嵌入XPath的环境。

XSLT样式表

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="values"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="value"> 
     <xsl:copy> 
      <xsl:value-of select="concat(floor(. div 60),':',. mod 60)"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML输入

<?xml version="1.0" encoding="UTF-8"?> 
<values> 
    <value>80</value> 
    <value>90</value> 
</values> 

XML输出

<?xml version="1.0" encoding="UTF-8"?> 
<values> 
    <value>1:20</value> 
    <value>1:30</value> 
</values> 

编辑:正如@derp指出的那样,如果你需要拼出“分钟”和“秒”并区分复数和单数,这是没有用的。这是另一个版本来处理,恐怕稍微复杂一点。

另外,现在您已经到了一个难以在XPath中单独解决问题的地步。您需要达到使用XPath的更高级语言。

样式表

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="values"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="value"> 

    <xsl:variable name="mins"> 
     <xsl:value-of select="concat(floor(. div 60),' ')"/> 
     <xsl:value-of select="concat(substring('minute', 1 div boolean(floor(. div 60) = 1)), 
     substring('minutes', 1 div boolean(floor(. div 60) != 1)))"/> 
    </xsl:variable> 
    <xsl:variable name="secs"> 
     <xsl:value-of select="concat(. mod 60,' ')"/> 
     <xsl:value-of select="concat(substring('second', 1 div boolean(. mod 60 = 1)), 
     substring('seconds', 1 div boolean(. mod 60 != 1)))"/> 
    </xsl:variable> 
     <xsl:copy> 
      <xsl:value-of select="concat($mins,',',$secs)"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML输出

<?xml version="1.0" encoding="UTF-8"?> 
<values> 
    <value>1 minute,20 seconds</value> 
    <value>1 minute,30 seconds</value> 
</values> 

在如果你想知道:如果为0分或秒,正确的复数minutesseconds被输出。

+2

@derp你说得对,我没有考虑这个细节。感谢您的发现!我可能会扩展我的答案 - 只要我知道OP是否真的需要拼写出的单词:-)。 – 2014-08-27 17:55:18

+0

这将是一个很好的例子,如何做到这一点:) – 2014-08-27 18:11:26

+0

@Dalek,我编辑了我的答案,包括这个。由于您仅限于XPath 1.0,因此我认为解决方案很难阅读。 – 2014-08-27 18:14:29