2016-07-28 14 views
2

Ich versuche, ein XSLT-Stylesheet zu schreiben, das die Millisekunden von einem beliebigen Zeitstempel in einem XML-Formular entfernt. Meine Beispiel-XML unten ist nur ein Beispiel, es könnte denkbar sein, dass es eine beliebige Anzahl von Zeitstempeln im Umschlag gibt. Ich denke also, ich muss den Zeitstempel anpassen und ihn dann umwandeln.XSLT zum Entfernen von Millisekunden aus Timestamp

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    </soap:Header> 
     <soap:Body> 
     <Staging_Submit_Service xmlns="com.xxx"> 
      <u_From_Partner__c>Our Partner</u_From_Partner__c> 
      <u_To_Partner__c>Us</u_To_Partner__c> 
      <u_Partner_CI__c/> 
      <u_Partner_ID__c>10051</u_Partner_ID__c> 
      <u_Partner_Name__c>ROSEVILLE</u_Partner_Name__c> 
      <u_Partner_Reported_Date__c>2016-07-26T17:38:28.746134Z</u_Partner_Reported_Date__c> 
      <u_Partner_Status_Reason__c>Failure in System</u_Partner_Status_Reason__c> 
      <u_Partner_Submit_Date__c>2016-07-25T18:11:23.5443Z</u_Partner_Submit_Date__c> 
      <u_Partner_Priority__c>Low</u_Partner_Priority__c> 
      <u_Partner_Service_Type>Event</u_Partner_Service_Type> 
     </Staging_Submit_Service> 
    </soap:Body> 
</soap:Envelope> 

und meine resultierende xml muss wie folgt aussehen:: Ich kann XSLT 2.0 Die ursprüngliche Nachricht wie folgt aussieht verwenden

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    </soap:Header><soap:Body> 
     <Staging_Submit_Service xmlns="com.xxx"> 
      <u_From_Partner__c>Our Partner</u_From_Partner__c> 
      <u_To_Partner__c>Us</u_To_Partner__c> 
      <u_Partner_CI__c/> 
      <u_Partner_ID__c>10051</u_Partner_ID__c> 
      <u_Partner_Name__c>ROSEVILLE</u_Partner_Name__c> 
      <u_Partner_Reported_Date__c>2016-07-26T17:38:28Z</u_Partner_Reported_Date__c> 
      <u_Partner_Status_Reason__c>Failure in System</u_Partner_Status_Reason__c> 
      <u_Partner_Submit_Date__c>2016-07-25T18:11:23Z</u_Partner_Submit_Date__c> 
      <u_Partner_Priority__c>Low</u_Partner_Priority__c> 
      <u_Partner_Service_Type>Event</u_Partner_Service_Type> 
     </Staging_Submit_Service> 
    </soap:Body> 
</soap:Envelope> 

Hinweis den Zeitstempel. Ich bin diesen Weg gegangen, aber es scheint mich nicht dahin zu bringen, wo ich sein muss.

Ich bin wirklich nur vage vertraut mit XSLT und dieses spezielle Problem erfordert, dass ich es benutze. Vielen Dank im Voraus

Antwort

0

Versuchen

<xsl:template match="*[not(*) and . castable as xs:dateTime]"> 
    <xsl:copy> 
    <xsl:value-of select="format-dateTime(., '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]')"/> 
    </xsl:copy> 
</xsl:template> 

plus Ihre erste Vorlage.

So ist die komplette Sheet ist

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[not(*) and . castable as xs:dateTime]"> 
     <xsl:copy> 
      <xsl:value-of select="format-dateTime(., '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]')"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

die Wirklichkeit scheint über keine Zeitzone Suffix zu bewahren vorhanden und gewährleistet es Ausgabe als Z ist, wenn es UTC ein bisschen schwierig ist, aber ich denke, wenn man das machen value-of

 <xsl:value-of select="if (timezone-from-dateTime(.) eq xs:dayTimeDuration('PT0H')) then format-dateTime(., '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]Z') else format-dateTime(., '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01][Z]')"/> 

dann funktioniert es gut.

Es scheint, das Problem über die Zeitzone Z in https://www.w3.org/TR/xpath-functions-31/#rules-for-datetime-formatting aufgelöst wurde

 <xsl:value-of select="format-dateTime(., '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01][Z00:00t]')"/> 

zu ermöglichen, aber ich habe nicht geprüft, ob das mit XmlPrime oder Prozessoren anders als Saxon arbeitet.

Die folgenden Werke für mich mit Xalan innen Sauerstoff so weit wie die beiden Elemente mit datetime in Ihrer Eingabe Probe zu identifizieren und Neuformatierung sie die Dezimalstellen der Sekunden zu entfernen:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:date="http://exslt.org/dates-and-times" 
    exclude-result-prefixes="xs date" version="1.0"> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[not(*) and string-length() > 19 and date:date() != '']"> 
     <xsl:copy> 
      <xsl:value-of select="date:format-date(date:date(.), &quot;yyyy-MM-dd'T'HH:mm:ssZ&quot;)"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

jedoch die erzeugten Ausgangsdaten abweichen Die Eingabe <u_Partner_Reported_Date__c>2016-07-26T17:38:28.746134Z</u_Partner_Reported_Date__c> wird als <u_Partner_Reported_Date__c>2016-07-25T22:00:00+0000</u_Partner_Reported_Date__c> angezeigt, sodass entweder die Datumsanalyse oder die Formatierung unterbrochen ist.

+0

Das hat funktioniert Großartig in meinem Tester, aber es hat sich beim Versuch, es in der Appliance zu verwenden, geirrt. Meine Vermutung ist andere Xml Parser: –

+0

Meine Vermutung ist anders Xml Parser: Ich erhalte den Fehler: Fehler: 'Syntax Fehler in' * [nicht (*) und. umsetzbar als xs: dateTime] '.' FATALER FEHLER: 'com.sun.org.apache.xalan.internal.xsltc.compiler.NotCall kann nicht in com.sun.org.apache.xalan.internal.xsltc.compiler.Pattern' : com.sun umgewandelt werden. org.apache.xalan.internal.xsltc.compiler.NotCall kann nicht in com.sun.org.apache.xalan.internal.xsltc.compiler.Pattern umgewandelt werden. Irgendeine Chance, ein anderes Matchmuster zu versuchen? –

+0

Wenn Sie XSLT 2.0 in der Java-Welt verwenden wollen, dann müssen Sie Saxon 9 von Saxonica verwenden, Xalan ist ein XSLT 1.0-Prozessor und unterstützt weder den 'xs: dateTime'-Datentyp noch den XPath 2.0' castable as' -Ausdruck die 'format-dateTime' noch die' matches' oder 'replace' Funktion, die Sie versucht haben zu verwenden. –

1

Aus den Kommentaren scheint es, dass Sie nur eine XSLT 1.0-Lösung verwenden können.

ist hier ein:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:df="com.xxx"> 
<xsl:output omit-xml-declaration="yes"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="df:u_Partner_Reported_Date__c/text() 
         |df:u_Partner_Submit_Date__c/text()"> 
    <xsl:value-of select="concat(substring-before(.,'.'), 'Z')"/> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf der mitgelieferten XML-Dokument angewendet wird:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    </soap:Header> 
     <soap:Body> 
     <Staging_Submit_Service xmlns="com.xxx"> 
      <u_From_Partner__c>Our Partner</u_From_Partner__c> 
      <u_To_Partner__c>Us</u_To_Partner__c> 
      <u_Partner_CI__c/> 
      <u_Partner_ID__c>10051</u_Partner_ID__c> 
      <u_Partner_Name__c>ROSEVILLE</u_Partner_Name__c> 
      <u_Partner_Reported_Date__c>2016-07-26T17:38:28.746134Z</u_Partner_Reported_Date__c> 
      <u_Partner_Status_Reason__c>Failure in System</u_Partner_Status_Reason__c> 
      <u_Partner_Submit_Date__c>2016-07-25T18:11:23.5443Z</u_Partner_Submit_Date__c> 
      <u_Partner_Priority__c>Low</u_Partner_Priority__c> 
      <u_Partner_Service_Type>Event</u_Partner_Service_Type> 
     </Staging_Submit_Service> 
    </soap:Body> 
</soap:Envelope> 

das gewünschte, korrekte Ergebnis hergestellt:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header> 
    </soap:Header> 
     <soap:Body> 
     <Staging_Submit_Service xmlns="com.xxx"> 
      <u_From_Partner__c>Our Partner</u_From_Partner__c> 
      <u_To_Partner__c>Us</u_To_Partner__c> 
      <u_Partner_CI__c/> 
      <u_Partner_ID__c>10051</u_Partner_ID__c> 
      <u_Partner_Name__c>ROSEVILLE</u_Partner_Name__c> 
      <u_Partner_Reported_Date__c>2016-07-26T17:38:28Z</u_Partner_Reported_Date__c> 
      <u_Partner_Status_Reason__c>Failure in System</u_Partner_Status_Reason__c> 
      <u_Partner_Submit_Date__c>2016-07-25T18:11:23Z</u_Partner_Submit_Date__c> 
      <u_Partner_Priority__c>Low</u_Partner_Priority__c> 
      <u_Partner_Service_Type>Event</u_Partner_Service_Type> 
     </Staging_Submit_Service> 
    </soap:Body> 
</soap:Envelope> 
Verwandte Themen