2014-08-27 122 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