2016-04-14 12 views
1

XML/XPath/XSLT Frage. Ich habe einen Ur-Ur-Großelternknoten, der den Wert des tieferen Enkelknotens bestimmen sollte. Alle anderen Knoten solltenXSLT Anwenden-Vorlagen oder Anruf-Vorlage basierend auf XML-Wert

Hier ist der XML kopiert werden (von einem Anbieter, habe ich keine Kontrolle über das Format)

die Zahlungsart (in der PmtInf/PmtTpInf/LclInstrm/Cw-Wert kann ABC oder XYZ und basierend auf diesem Wert die PmtInf/DBTR/Id/OrgId/Othr/Id-Wert sollte 111111111 oder 222222222

sein, die ich mit xslt wie

<xsl:template match="CstmrCdtTrfInitn/PmtInf/PmtTpInf/LclInstrm[iso3:Cd='ABC']"> 

aber irgendwelche Elemente erfolgreich mithalten kann ich das schreiben höhere Ebene sind auf dem gleichen Niveau (das wäre zu erwarten)

Wenn ich die untere Ebene übereinstimmen, ich nicht in der Lage bin zu „finden“ der höheren Knotenwert <xsl:template match="PmtInf/Dbtr/Id/OrgId/Othr">

habe ich versucht, den Wert auf variable Einstellung zu vergleichen, habe ich versucht, mit Hilfe von XSLT wie

"../../../../PmtInf/PmtTpInf/LclInstrm/Cd = 'ABC'" 

oder XPath "//Id/ancestor::LclInstrm[1]"

<?xml version="1.0" encoding="utf-8"?> 
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"> 
    <CstmrCdtTrfInitn> 
     <GrpHdr> 
     <MsgId>1302</MsgId> 
     <CreDtTm>2016-04-06T08:30:44.533-07:00</CreDtTm> 
     <NbOfTxs>2</NbOfTxs> 
     <CtrlSum>0000.000</CtrlSum> 
     <InitgPty> 
      <Nm>NAME</Nm> 
      <Id> 
       <OrgId> 
        <Othr> 
        <Id>SPECIALID</Id> 
        <SchmeNm> 
         <Prtry>CUST</Prtry> 
        </SchmeNm> 
        </Othr> 
       </OrgId> 
      </Id> 
     </InitgPty> 
     </GrpHdr> 
     <PmtInf> 
     <PmtInfId>IDNUMBER</PmtInfId> 
     <PmtMtd>TRF</PmtMtd> 
     <BtchBookg>false</BtchBookg> 
     <NbOfTxs>2</NbOfTxs> 
     <CtrlSum>0000.00</CtrlSum> 
     <PmtTpInf> 
      <InstrPrty>NORM</InstrPrty> 
      <SvcLvl> 
       <Cd>NURG</Cd> 
      </SvcLvl> 
      <LclInstrm> 
       <Cd>ABC</Cd><!-- This is the payment type, can be ABC or XYZ this value drives the Dbtr/Id/OrgId/Othr/Id value--> 
      </LclInstrm> 
     </PmtTpInf> 
     <ReqdExctnDt>2016-04-06-07:00</ReqdExctnDt> 
     <Dbtr> 
      <Nm>NAME</Nm> 
      <PstlAdr> 
       <AdrTp>ADDR</AdrTp> 
       <PstCd>ZIP</PstCd> 
       <TwnNm>CITY</TwnNm> 
       <CtrySubDvsn>STATE</CtrySubDvsn> 
       <Ctry>US</Ctry> 
       <AdrLine>ADDRESS1</AdrLine> 
       <AdrLine>ADDRESS2</AdrLine> 
      </PstlAdr> 
      <Id> 
       <OrgId> 
        <Othr> 
        <Id>1234567890</Id><!-- This field changes based on payment type field above. If ABC, 111111111 if XYZ 222222222 --> 
        <SchmeNm> 
         <Cd>CHID</Cd> 
        </SchmeNm> 
        </Othr> 
       </OrgId> 
      </Id> 
     </Dbtr> 
       </PmtInf> 
    </CstmrCdtTrfInitn> 
</Document> 

die gewünschte Ausgabe würde die gleiche Knoten/Format aber der Wert würde es hier

 <Id> 
      <OrgId> 
       <Othr> 
       <Id>111111111 (or 222222222 based on ancestor)</Id>   
       <SchmeNm> 
        <Cd>CHID</Cd> 
       </SchmeNm> 
       </Othr> 
      </OrgId> 
     </Id> 
+1

Ihr XML-Dokument in a * Namensraum * (nachschlagen). Das bedeutet, dass Ihre Vorlage zu nichts passt (im Gegensatz zu dem, was Sie behaupten), und ebenso wählen Ihre ausgewählten Ausdrücke nichts aus. - PS Die einfache Methode zur Auswahl eines Vorfahrenknotens besteht in der Verwendung der Vorfahrenachse. Oder starten Sie einfach an der Wurzel (vorausgesetzt, es gibt nur einen Knoten "CstmrCdtTrfInitn"). –

+0

Was ist Ihre gewünschte Ausgabe? – zx485

+0

Ich habe den Namespace aus dem XSLT entfernt, um den Post zu entschlüsseln. Es ist da drin. Ich kann bearbeiten und hinzufügen. – Jay

Antwort

1

Versuchen Sie, diese Art und Weise ändern:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns1="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="ns1:Dbtr/ns1:Id/ns1:OrgId/ns1:Othr/ns1:Id"> 
    <xsl:variable name="cd" select="ancestor::ns1:PmtInf/ns1:PmtTpInf/ns1:LclInstrm/ns1:Cd" /> 
    <xsl:copy> 
     <xsl:choose> 
      <xsl:when test="$cd='ABC'">111111111</xsl:when> 
      <xsl:when test="$cd='XYZ'">222222222</xsl:when> 
     </xsl:choose>  
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

DANKE! Das funktioniert. alle meine +1. Ich kämpfte mit der Ahnen :: Syntax und normalerweise arbeite ich "top down" in XSLT aber ich konnte nicht herausfinden, wie man das in diesem Fall macht – Jay

+0

@Jay: Ja, bitte [** accept **] (http: // meta .stackoverflow.com/q/5234/234215) diese Antwort, wenn es hilfreich ist, und erwägen, einige der anderen guten Antworten zu akzeptieren, die Sie für Ihre [Fragen der letzten zwei Jahre] erhalten haben (http://stackoverflow.com/users)/4325632/jay? Tab = Fragen). Vielen Dank. – kjhughes

+0

Akzeptierte Antwort für diesen Beitrag und die anderen. Es tut uns leid. Schlechtes Community-Mitglied. – Jay

Verwandte Themen