2009-03-09 5 views
2

mit scheint es so einfach ist, in XSLT 2.0, aber Microsoft in seiner unendlichen Weisheit XSLT 2.0 2005.Wie kann ich eine ISO 8601 Dauer Sekunden konvertieren XSLT 1.0

+0

Sie sind schon seit zwei Jahren: http://blogs.msdn.com/xmlteam/archive/2007/01/29/xslt-2-0.aspx! Bald wird es ein Ergebnis geben! –

+0

Hmmm Ich frage mich, ob ich meinen Chef davon überzeugen kann, dass es so weit geht, bis es richtig ist. :-) –

Antwort

1

Eine Option wäre, alle Parsing und Berechnung in XSLT zu tun.

Allerdings wäre eine weitere Option XSLT erweitern mit einer benutzerdefinierten Skriptfunktion in 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> 

Die Script-Funktion wird zur Laufzeit in eine temporäre Montage und dann ausgeführt kompiliert werden. Beachten Sie jedoch, dass Sie Ihre XSLT zwischenspeichern, da bei jeder XSLT-Kompilierung eine neue Assembly erstellt wird, die erst beim Beenden der Anwendung entladen wird.

+0

Interessant, ich wusste nicht, dass es so einfach war, C# einzubetten. –

+0

Ja, es ist ziemlich einfach. Jedoch einige Vorbehalte. Wenn Sie externe Baugruppen referenzieren, könnten Sie Mono brechen Kompatibilität, das Problem, das ich mit dem Entladen der Baugruppe erwähnt habe, gibt es auch Erweiterungsobjekte, ein besser geeigneter Ansatz, aber leider immer noch mit schlechter Leistung in .NET 3.5 als Skript. –

4

mit XSLT in Visual Studio nicht unterstützt zu tun 1.0 müssen Sie substring-before() und substring-after() verwenden, um sie in einzelne Felder aufzuteilen. Dann multipliziere einfach. Zweifellos ist es möglich, obwohl es sehr mühsam erscheint.

+0

Ich hatte Angst davor :-( –

Verwandte Themen