Как преобразовать продолжительность ISO 8601 в секунды, используя XSLT 1.0 - PullRequest
2 голосов
/ 09 марта 2009

Кажется, что это легко сделать в XSLT 2.0, но Microsoft в своей бесконечной мудрости не поддерживает XSLT 2.0 в Visual Studio 2005.

Ответы [ 2 ]

4 голосов
/ 09 марта 2009

В XSLT 1.0 вам придется использовать substring-before () и substring-after (), чтобы разбить его на отдельные поля. Тогда просто умножьте. Без сомнения, это возможно, хотя это кажется очень трудоемким.

1 голос
/ 09 марта 2009

Один из вариантов - выполнить все операции синтаксического анализа и вычисления в XSLT.

Однако, другим вариантом было бы расширить XSLT с помощью специальной функции сценария в C #:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:myext="urn:myExtension"
                exclude-result-prefixes="msxsl myext">

  <xsl:output method="xml" indent="yes"/>

  <msxsl:script language="C#" implements-prefix="myext">

    <![CDATA[

        public int SecondsFromIsoDuration(string isoDuration)
        {
            // parse and convert here;
        }

    ]]>

  </msxsl:script>


  <xsl:template match="@* | node()">
    <root durationInSeconds="{myext:SecondsFromIsoDuration(@duration)}" />
  </xsl:template>
</xsl:stylesheet>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...