XPath 1.0: преобразовать ss в минуты, секунды

Как преобразовать секунды в минуты: секунды в XPath 1.0?

Например:

источник:

<values>
    <value>80</value>
<values>

вывод запроса должен быть 1 minute, 20 seconds


person D. Caan    schedule 27.08.2014    source источник


Ответы (1)


Используйте операторы 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.

person Mathias Müller    schedule 27.08.2014
comment
@derp Ты прав, я не учел эту деталь. Спасибо, что заметили! Я мог бы расширить свой ответ - как только узнаю, действительно ли ОП нуждается в прописанных словах :-). - person Mathias Müller; 27.08.2014
comment
Было бы неплохо иметь пример того, как это сделать:) - person D. Caan; 27.08.2014
comment
@Dalek, я отредактировал свой ответ, включив это. Поскольку вы ограничены XPath 1.0, решение, на мой взгляд, трудно читать. - person Mathias Müller; 27.08.2014
comment
@derp Ваше желание было исполнено - посмотрите. - person Mathias Müller; 27.08.2014