Один из вариантов - выполнить все операции синтаксического анализа и вычисления в 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-компиляция создает новую сборку, которая выгружается только при выходе из приложения.