2016-03-23 10 views
2

Ich habe eine XSLT, die von einem SOAP-Antwort-XML in ein Java-Objekt umgewandelt wird.Teilen, ersetzen und verketten eine Zeichenfolge in XSLT 2.0

In der Soap-Antwort gibt es Knoten urn:Statues, die Komma (,) getrennte Zeichenfolge hat.

Ich möchte den Wert von urn:Statues Knoten teilen und einen Teil des Wertes ersetzen und diese wieder in eine Zeichenfolge mit Komma (,) getrennt verketten.

Soap Antwort:

Mein XSLT:

<?xml version='1.0' encoding='UTF-8'?> 
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:urn="urn:HPD_Incident_Query_WS"> 
    <xsl:output method='xml' indent='yes' /> 

    <xsl:template match="urn:Incident_Query_ServiceResponse" name="split"> 
     <xsl:for-each select="tokenize(./urn:Statuses,',')"> 
      <xsl:if test="(normalize-space(.) eq 'Cerrado')"> 
       <xsl:value-of select="replace(normalize-space(.), 'Cerrado', 'CLOSED')"/> 
      </xsl:if> 
      <xsl:if test="(normalize-space(.) eq 'CANCELLED')"> 
       <xsl:value-of select="replace(normalize-space(.), 'CANCELLED', 'CLOSED')"/> 
      </xsl:if> 
      <xsl:if test="(normalize-space(.) eq 'En Curso')"> 
       <xsl:value-of select="replace(normalize-space(.), 'En Curso', 'OPENACTIVE')"/> 
      </xsl:if> 
      <xsl:if test="(normalize-space(.) eq 'Pendiente')"> 
       <xsl:value-of select="replace(normalize-space(.), 'Pendiente', 'CLOSED.PENDING')"/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match='/'> 
     <getTicketInfoResponse> 
      <responseCode> 
       <xsl:value-of select='/soapenv:Envelope/soapenv:Body/urn:Incident_Query_ServiceResponse/urn:ResponseCode' /> 
      </responseCode> 
      <responseMessage> 
       <xsl:value-of select='/soapenv:Envelope/soapenv:Body/urn:Incident_Query_ServiceResponse/urn:ResponseMsg' /> 
      </responseMessage> 
      <errorCode> 
       <xsl:value-of select='/soapenv:Envelope/soapenv:Body/urn:Incident_Query_ServiceResponse/urn:ErrorCode' /> 
      </errorCode> 
      <errorMsg> 
       <xsl:value-of select='/soapenv:Envelope/soapenv:Body/urn:Incident_Query_ServiceResponse/urn:ErrorMsg' /> 
      </errorMsg> 
      <ticketDetails> 
       <troubleTicketState> 
        <xsl:apply-templates select="/soapenv:Envelope/soapenv:Body"/> 
       </troubleTicketState> 
       <troubleTicketId> 
        <xsl:value-of select='/soapenv:Envelope/soapenv:Body/urn:Incident_Query_ServiceResponse/urn:Incidents_Number' /> 
       </troubleTicketId> 
      </ticketDetails> 
     </getTicketInfoResponse> 
    </xsl:template> 
</xsl:stylesheet> 

Das Problem hier ist, wenn der Wert auf urn:Statuses gesetzt werden die Werte nicht durch Komma (,) getrennt .

Aktuell Ergebnis nach der Transformation:

<?xml version="1.0" encoding="UTF-8"?> 
<getTicketInfoResponse xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:urn="urn:HPD_Incident_Query_WS"> 
    <responseCode/> 
    <responseMessage/> 
    <errorCode>0</errorCode> 
    <errorMsg/> 
    <ticketDetails> 
     <troubleTicketState> CLOSEDCLOSEDOPENACTIVECLOSED</troubleTicketState> 
     <troubleTicketId>INC80167842,INC77752907,INC20954581,INC20954533</troubleTicketId> 
    </ticketDetails> 
</getTicketInfoResponse> 

Erwartetes Ergebnis:

<?xml version="1.0" encoding="UTF-8"?> 
<getTicketInfoResponse xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:urn="urn:HPD_Incident_Query_WS"> 
    <responseCode/> 
    <responseMessage/> 
    <errorCode>0</errorCode> 
    <errorMsg/> 
    <ticketDetails> 
     <troubleTicketState>CLOSED,CLOSED,OPENACTIVE,CLOSED</troubleTicketState> 
     <troubleTicketId>INC80167842,INC77752907,INC20954581,INC20954533</troubleTicketId> 
    </ticketDetails> 
</getTicketInfoResponse> 

Kann jemand sagen, wie die Zeichenfolge durch Komma trennen (,) in dem resultierenden Tag <troubleTicketState>.

Gibt es einen besseren Weg, dies zu tun?

Vielen Dank im Voraus.

Antwort

5

Könnten Sie nicht einfach tun:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' 
xmlns:urn='urn:HPD_Incident_Query_WS'> 

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

<xsl:template match="/soapenv:Envelope"> 
    <getTicketInfoResponse> 
     <responseCode> 
      <xsl:value-of select="soapenv:Body/urn:Incident_Query_ServiceResponse/urn:ResponseCode" /> 
     </responseCode> 
     <responseMessage> 
      <xsl:value-of select="soapenv:Body/urn:Incident_Query_ServiceResponse/urn:ResponseMsg" /> 
     </responseMessage> 
     <errorCode> 
      <xsl:value-of select="soapenv:Body/urn:Incident_Query_ServiceResponse/urn:ErrorCode" /> 
     </errorCode> 
     <errorMsg> 
      <xsl:value-of select="soapenv:Body/urn:Incident_Query_ServiceResponse/urn:ErrorMsg" /> 
     </errorMsg> 
     <ticketDetails> 
      <troubleTicketState> 
       <xsl:apply-templates select="soapenv:Body/urn:Incident_Query_ServiceResponse/urn:Statuses" /> 
      </troubleTicketState> 
      <troubleTicketId> 
       <xsl:value-of select="soapenv:Body/urn:Incident_Query_ServiceResponse/urn:Incidents_Number" /> 
      </troubleTicketId> 
     </ticketDetails> 
    </getTicketInfoResponse> 
</xsl:template> 

<xsl:template match="urn:Statuses"> 
    <xsl:value-of select="replace(replace(replace(replace(., 'Cerrado', 'CLOSED'), 'CANCELLED', 'CLOSED'), 'En Curso', 'OPENACTIVE'), 'Pendiente', 'CLOSED.PENDING')"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

Thank you !!! Ich habe nicht so gedacht. Es funktioniert perfekt. – dev

+0

@ amit4497 Beachten Sie, dass davon ausgegangen wird, dass die ersetzten Werte nicht als Teilzeichenfolgen in anderen Werten angezeigt werden. –

+0

Sorry, habe den letzten Teil nicht bekommen. – dev

Verwandte Themen