2017-12-21 4 views
2

Ich bin neu in XSL-Karten. Ich möchte alle Instanzen einer falschen Zeitzone ersetzen. Ich kenne die Namen der Felder, dass dies passieren könnte. Es mag Fälle geben, in denen die Zeitzone korrekt ist, ich möchte also nur +01: 00 durch +00: 00 ersetzen.XSL - Ich möchte alle Vorkommen einer falschen Zeitzone in meinen Daten ersetzen

Hier ist, was meine Eingabe wie (grob) aussieht:

<WORKORDERSet> 
    <WORKORDER> 
     <CLIENT_WORKORDER> 
     <COMPLETION_SLA_DATE>2017-07-14T10:11:20+01:00</COMPLETION_SLA_DATE> 
     <REGION>100000</REGION> 
     <RESPONSE_SLA_DATE>2017-07-12T10:11:20+01:00</RESPONSE_SLA_DATE> 
     <WO_NUM>W1000669</WO_NUM> 
     </CLIENT_WORKORDER> 
    </WORKORDER> 
    <WORKORDER> 
     <CLIENT_WORKORDER> 
     <COMPLETION_SLA_DATE>2017-12-14T10:11:20+01:00</COMPLETION_SLA_DATE> 
     <REGION>100000</REGION> 
     <RESPONSE_SLA_DATE>2017-12-12T10:12:20+01:00</RESPONSE_SLA_DATE> 
     <WO_NUM>W1000420</WO_NUM> 
     </CLIENT_WORKORDER> 
    </WORKORDER> 
</WORKORDERSet> 

Hier ist, was ich meine Ausgabe aussehen soll:

<WORKORDERSet> 
    <WORKORDER> 
     <CLIENT_WORKORDER> 
     <COMPLETION_SLA_DATE>2017-07-14T10:11:20+00:00</COMPLETION_SLA_DATE> 
     <REGION>100000</REGION> 
     <RESPONSE_SLA_DATE>2017-07-12T10:11:20+00:00</RESPONSE_SLA_DATE> 
     <WO_NUM>W1000669</WO_NUM> 
     </CLIENT_WORKORDER> 
    </WORKORDER> 
    <WORKORDER> 
     <CLIENT_WORKORDER> 
     <COMPLETION_SLA_DATE>2017-12-14T10:11:20+00:00</COMPLETION_SLA_DATE> 
     <REGION>100000</REGION> 
     <RESPONSE_SLA_DATE>2017-12-12T10:12:20+00:00</RESPONSE_SLA_DATE> 
     <WO_NUM>W1000420</WO_NUM> 
     </CLIENT_WORKORDER> 
    </WORKORDER> 
</WORKORDERSet> 

Und hier ist die XSL, die ich versucht habe zu verwenden, aber Ich weiß nicht, was ich falsch mache:

Sorry für die noob Frage, aber jede Hilfe hier ist willkommen. Vielen Dank!

Antwort

0

Hier ist eine weitere Option, die den Text nur verarbeitet(), die +01:00 in Elemente enthält whos Name mit _DATE endet ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template 
    match="*[contains(concat(local-name(),'|'),'_DATE|')]/text()[contains(.,'+01:00')]"> 
    <xsl:value-of select="substring-before(.,'+01:00')"/> 
    <xsl:text>+00:00</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+1

Dies ist perfekt für das, was ich tun muss. – Aporia

1

Sie bereiten sollen Vorlage ersetzen zunächst dynamisch zu machen, dann passen alle Knoten von CLIENT_WORKORDER - *[parent::CLIENT_WORKORDER] jeden von ihnen zu überprüfen und ersetzen +01:00 mit +00:00 finden XSL unter:

<xsl:stylesheet xmlns:max="http://www.ibm.com/maximo" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" omit-xml-declaration="yes"/> 
    <!--template with value replacing--> 
    <xsl:template name="replace-template"> 
     <xsl:param name="param.str"/> 
     <xsl:param name="param.target"/> 
     <xsl:param name="param.replacement"/> 
     <xsl:choose> 
      <xsl:when test="contains($param.str, $param.target)">      
       <xsl:value-of select="concat(substring-before($param.str, $param.target), $param.replacement, substring-after($param.str, $param.target))"/>    
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$param.str"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
    <!--copy all nodes--> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <!--take each element of CLIENT_WORKORDER and if it contains +01:00 it will replace it with +00:00--> 
    <xsl:template match="*[parent::CLIENT_WORKORDER]">     
     <xsl:element name="{name()}">      
      <xsl:call-template name="replace-template">      
       <xsl:with-param name="param.str" select="."/>      
       <xsl:with-param name="param.target" select="'+01:00'"/>      
       <xsl:with-param name="param.replacement" select="'+00:00'"/>     
      </xsl:call-template>    
     </xsl:element>  
    </xsl:template> 
</xsl:stylesheet> 

Ergebnis wie erwartet:

<WORKORDERSet> 
    <WORKORDER> 
     <CLIENT_WORKORDER> 
     <COMPLETION_SLA_DATE>2017-07-14T10:11:20+00:00</COMPLETION_SLA_DATE> 
     <REGION>100000</REGION> 
     <RESPONSE_SLA_DATE>2017-07-12T10:11:20+00:00</RESPONSE_SLA_DATE> 
     <WO_NUM>W1000669</WO_NUM> 
     </CLIENT_WORKORDER> 
    </WORKORDER> 
    <WORKORDER> 
     <CLIENT_WORKORDER> 
     <COMPLETION_SLA_DATE>2017-12-14T10:11:20+00:00</COMPLETION_SLA_DATE> 
     <REGION>100000</REGION> 
     <RESPONSE_SLA_DATE>2017-12-12T10:12:20+00:00</RESPONSE_SLA_DATE> 
     <WO_NUM>W1000420</WO_NUM> 
     </CLIENT_WORKORDER> 
    </WORKORDER> 
</WORKORDERSet> 
+0

Danke, dass funktioniert gut für die Frage, die ich fragte. Leider war die Probe, die ich einschloss, ziemlich schlecht. Es gibt tatsächlich eine zusätzliche Ebene im Baum. usw. Der Elternanruf funktioniert nicht, wenn es eine zusätzliche Ebene gibt. Mir fehlt noch etwas. – Aporia

+0

Um zu klären; Das verschraubt es komplett: [Eltern :: QueryWORKORDERResponse/WORKORDERset/WORKORDER/CLIENT_WORKORDER] "> – Aporia

+0

@Aporia Lösung in meiner Antwort sollte für alle Elemente von CLIEN T_WORKORDER funktionieren, und es ist egal, ob es sein wird/WORKORDERset/WORKORDER/CLIENT_WORKORDER oder/WORKORDERset/WORKORDER/x/x/x/x/x/x/x/CLIENT_WORKORDER Hauptsächlich, um diese Übereinstimmung zu behalten = "* [Eltern :: CLIENT_WORKORDER]" –

Verwandte Themen