2016-06-25 6 views
1

Ich habe die folgende XML basierend auf Attribute mit XSLT analysieren:Wie gleichnamigen Kind Elemente

<?xml version='1.0' encoding='UTF-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <GetGridResult xmlns="http://namespace.net/functions/GetGridResult"> 
      <GRIDRESULT type="LIST.DATA_ONLY.STORED"> 
       <DATASPY id="105429" label="VAN" /> 
       <TOOLBAR jsonclass="object" /> 
       <GRID> 
        <METADATA> 
         <REQUEST_TYPE_META>LIST.DATA_ONLY.STORED</REQUEST_TYPE_META> 
         <RECORDS>446</RECORDS> 
         <CLIENTROWS>5</CLIENTROWS> 
         <ISSYSTEMUSER>false</ISSYSTEMUSER> 
        </METADATA> 
        <DATA jsonclass="array"> 
         <ROW id="1"> 
          <D n="5">4451</D><D n="13">BO</D><D n="15">C</D><D n="16">Closed</D><D n="22">0301</D><D n="26">01/26/2015 00:00</D><D n="122">CMBC</D><D n="279">236366</D><D n="608">REP</D><D n="694">BR</D><D n="757">BAD AC</D><D n="1900" /> 
          <D n="4998">2</D><D n="6941">A</D> 
         </ROW> 
         <ROW id="2"> 
          <D n="5">4451</D><D n="13">BO</D><D n="15">C</D><D n="16">Closed</D><D n="22">0665</D><D n="26">01/23/2015 00:00</D><D n="122">CMBC</D><D n="279">236367</D><D n="608">REP</D><D n="694">BR</D><D n="757">DOOR CONTROL</D><D n="1900" /> 
          <D n="4998">2</D><D n="6941">A</D> 
         </ROW> 
        </DATA> 
       </GRID> 
      </GRIDRESULT> 
     </GetGridResult> 
    </soapenv:Body> 
</soapenv:Envelope> 

I (mehr gibt es als ich hier gezeigt) alle Zeilen abrufen müssen und eine Reihe erhalten die folgend auf die Attribute zur Ausgabe auf Basis der „D“ Elemente:

<WorkOrderResponse> 
    <WorkOrders> 
     <WorkOrder> 
      <WorkOrderId>236366</WorkOrderId> 
      <Description>BAD AC</Description> 
      <DateReported>01/26/2015 00:00</DateReported> 
      <ClassId>BO</ClassId> 
      <ProblemCode>0301</ProblemCode> 
      <ActionCode>REP</ActionCode> 
     </WorkOrder> 
     <WorkOrder> 
      <WorkOrderId>236367</WorkOrderId> 
      <Description>DOOR CONTROL</Description> 
      <DateReported>01/23/2015 00:00</DateReported> 
      <ClassId>BO</ClassId> 
      <ProblemCode>0665</ProblemCode> 
      <ActionCode>REP</ActionCode> 
     </WorkOrder>  
    </WorkOrders> 
</WorkOrderResponse> 

Hier ist die XSL, die ich mit gearbeitet, aber ich kann nicht scheinen, um diese Funktion zu erhalten. Sie werden sehen, dass ich versuche, die D-Elemente basierend auf dem Attribut "n" zu ziehen, d. H. "D [@ n = '279']".

Hier ist was gerade ausspuckt, wenn ich die xsl gegen die Beispiel-XML ausführen. Irgendwelche Ideen? Bitte helfen Sie mir hier draußen. Danke im Voraus!

<GetWorkOrdersResponse xmlns:ax21="http://samples.esb.wso2.org/xsd"> 
    <WorkOrders> 
     LIST.DATA_ONLY.STORED 446 5 false 

     4451BOCClosed030101/26/2015 00:00CMBC236366REPBRBAD AC 2A 

     4451BOCClosed066501/23/2015 00:00CMBC236367REPBRDOOR CONTROL 2A 
</WorkOrders> 
</GetWorkOrdersResponse> 

Antwort

1

Sie haben mehrere Probleme:

Zuerst erklären Sie dies im stylesheet tag:

xmlns:ns="http://namespace.net/functions/GetGridResult/GetGridResult" 

aber der eigentliche Namensraum im Eingangs XML verwendet wird:

"http://namespace.net/functions/GetGridResult" 

Als nächstes verwenden Sie nicht das Präfix, das Sie dem Namespace zugewiesen haben - also Ihr XPath e Xpressions stimmen nicht überein/wählen nichts aus.

Schließlich wenden Sie Vorlagen auf Knoten an, die Sie nicht verarbeiten möchten. Dies führt dazu, dass unerwünschte Textknoten in der Ausgabe aufgrund der integrierten Vorlagenregeln angezeigt werden.

Hier ist Ihr Sheet korrigiert:

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ax21="http://samples.esb.wso2.org/xsd" 
xmlns:ns="http://namespace.net/functions/GetGridResult" 
xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
exclude-result-prefixes="ns fn" 
version="2.0"> 
    <xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/> 


    <xsl:template match="/"> 
     <WorkOrdersResponse> 
      <WorkOrders> 
       <xsl:apply-templates select="//ns:DATA"/> 
      </WorkOrders> 
     </WorkOrdersResponse>  
    </xsl:template> 

    <xsl:template match="ns:DATA"> 
     <xsl:for-each select="ns:ROW"> 
      <WorkOrder> 
       <WorkOrderId> 
        <xsl:value-of select="ns:D[@n='279']"/> 
       </WorkOrderId> 
       <Description> 
        <xsl:value-of select="ns:D[@n='757']"/> 
       </Description> 
       <DateReported> 
        <xsl:value-of select="ns:D[@n='26']"/> 
       </DateReported> 
       <ClassId> 
        <xsl:value-of select="ns:D[@n='13']"/> 
       </ClassId> 
       <ProblemCode> 
        <xsl:value-of select="ns:D[@n='22']"/> 
       </ProblemCode> 
       <ActionCode> 
        <xsl:value-of select="ns:D[@n='608']"/> 
       </ActionCode> 
      </WorkOrder> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Natürlich können Sie das Ganze verkürzen konnte nur noch:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xpath-default-namespace="http://namespace.net/functions/GetGridResult"> 
<xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/> 

<xsl:template match="/"> 
    <WorkOrdersResponse> 
     <WorkOrders> 
      <xsl:for-each select="//ROW"> 
       <WorkOrder> 
        <WorkOrderId> 
         <xsl:value-of select="D[@n='279']"/> 
        </WorkOrderId> 
        <Description> 
         <xsl:value-of select="D[@n='757']"/> 
        </Description> 
        <DateReported> 
         <xsl:value-of select="D[@n='26']"/> 
        </DateReported> 
        <ClassId> 
         <xsl:value-of select="D[@n='13']"/> 
        </ClassId> 
        <ProblemCode> 
         <xsl:value-of select="D[@n='22']"/> 
        </ProblemCode> 
        <ActionCode> 
         <xsl:value-of select="nD[@n='608']"/> 
        </ActionCode> 
       </WorkOrder> 
      </xsl:for-each> 
     </WorkOrders> 
    </WorkOrdersResponse>  
</xsl:template> 

</xsl:stylesheet> 

Beachten Sie, dass xpath-default-namespace ist eine XSLT 2.0-Funktion.

+0

Danke Michael, das hat super geklappt. Ich weiß es zu schätzen, dass Sie sich die Zeit genommen haben, mir zu helfen. – Dolph

Verwandte Themen