Как преобразовать секунды в минуты: секунды в XPath 1.0?
Например:
источник:
<values>
<value>80</value>
<values>
вывод запроса должен быть 1 minute, 20 seconds
Как преобразовать секунды в минуты: секунды в XPath 1.0?
Например:
источник:
<values>
<value>80</value>
<values>
вывод запроса должен быть 1 minute, 20 seconds
Используйте операторы XPath 1.0 div
(в сочетании с floor
) и mod
. Для иллюстрации ниже приведена таблица стилей 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>
EDIT: как указал @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 минут или секунд, выводится правильное множественное число minutes
или seconds
.