Как конвертировать продолжительность даты XSLT 2.0 в строку? - PullRequest
3 голосов
/ 04 августа 2010

Я использую некоторый код для вычитания одной даты из другой с использованием XSLT 2.0:

<xsl:template match="moveInDate">
    <xsl:value-of select="current-date() - xs:date(.)"/>
</xsl:template>

Это работает, однако оставляет ответ с ответом P2243D, который, как я полагаю, соответствует "Период 2243 дня " (что правильно с точки зрения математики).

Поскольку мне нужно только количество дней, а не P и D, я знаю, что могу использовать подстроку или что-то подобное, но как новичку в XSLT, мне любопытно, есть ли лучший, более элегантный способ сделать это, чем простое манипулирование строками.

1 Ответ

7 голосов
/ 04 августа 2010

Вы можете просто использовать fn:days-from-duration(), чтобы получить длительность в виде xs:integer:

days-from-duration($arg as xs:duration?) как xs:integer?

Возвращает xs:integer, представляющее дникомпонент в каноническом лексическом представлении значения $arg.Результат может быть отрицательным.

Дополнительные сведения см. В спецификации функций и операторов XQuery 1.0 и XPath 2.0 .

В вашем случае:

<xsl:template match="moveInDate">
    <xsl:value-of select="days-from-duration(current-date() - xs:date(.))"/>
</xsl:template>

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Вы также можете сделать это, как вы говорите, с обработкой подстроки.Но, как вы указываете, это не является предпочтительным.Если по какой-то причине вы хотите сделать что-то подобное, вам нужно подумать о типах данных.Результат current-date() - xs:date(.) возвращается как xs:duration, который не может быть обработан функциями подстроки без приведения:

<xsl:template match="moveInDate">
  <xsl:variable name="dur" select="(current-date() - xs:date(.)) cast as xs:string"/>
  <xsl:value-of select="substring-before(substring-after($dur, 'P'), 'D')"/>
</xsl:template>
...