2017-03-03 6 views
0

Seit ein paar Tagen kämpfe ich um eine Lösung für dieses Problem. Ich habe diese XML:Zwei Knoten in XSLT verschmelzen

<?xml version="1.0" encoding="iso-8859-1"?> 
 
<Einreichung> 
 
    <EinreichZahlung> 
 
\t \t <EinreichZahlungen> 
 
\t \t \t <MemberFirstName>JOHN</MemberFirstName> 
 
\t \t \t <MemberLastName>DOE</MemberLastName> 
 
\t \t \t <MemberLogin>1</MemberLogin> 
 
\t \t \t <Store>0180</Store> 
 
\t \t </EinreichZahlungen> 
 
    </EinreichZahlung> 
 
\t <EinreichZahlung> 
 
\t \t <EinreichZahlungen> 
 
\t \t \t <MemberFirstName>DAVID</MemberFirstName> 
 
\t \t \t <MemberLastName>GREEN</MemberLastName> 
 
\t \t \t <MemberLogin>2</MemberLogin> 
 
\t \t \t <Store>0181</Store> 
 
\t \t </EinreichZahlungen> 
 
    </EinreichZahlung> 
 
    <EinreichPerson> 
 
\t \t <PersonBelege> 
 
\t \t \t <Belege> 
 
\t \t \t \t <MemberFirstName>JANE</MemberFirstName> 
 
\t \t \t \t <MemberLastName>DOE</MemberLastName> 
 
\t \t \t \t <MemberLogin>1</MemberLogin> 
 
\t \t \t \t <Store>0180</Store> 
 
\t \t \t </Belege> 
 
\t \t \t <Belege> 
 
\t \t \t \t <MemberFirstName>JANE</MemberFirstName> 
 
\t \t \t \t <MemberLastName>DOE</MemberLastName> 
 
\t \t \t \t <MemberLogin>1</MemberLogin> 
 
\t \t \t \t <Store>0180</Store> 
 
\t \t \t </Belege> 
 
\t \t </PersonBelege> 
 
    </EinreichPerson> 
 
    <EinreichPerson> 
 
\t \t <PersonBelege> 
 
\t \t \t <Belege> 
 
\t \t \t \t <MemberFirstName>DAVID</MemberFirstName> 
 
\t \t \t \t <MemberLastName>GREEN</MemberLastName> 
 
\t \t \t \t <MemberLogin>2</MemberLogin> 
 
\t \t \t \t <Store>0181</Store> 
 
\t \t \t </Belege> 
 
\t \t </PersonBelege> 
 
    </EinreichPerson> 
 
</Einreichung>

Ich brauche die beiden Knoten in einem mit XSLT fusionieren basierend auf dem Shop Wert, so dass die endgültige HTML wie folgt aussieht:

<pre><b> 
Zahlung 1080: JOHN DOE 
Belege 1080: details... 

Zahlung 1081: DAVID GREEN 
Belege 1081: details... 
</b></pre> 

Ich bin neu bei XSLT, also werde ich die Hilfe zu schätzen wissen.

Antwort

0

Während der Verarbeitung eines Knotens können Sie jeden Knoten in der XML-Struktur mit dem Xpath-Ausdruck finden. Um dies zu beschleunigen, ist es besser, einen Schlüssel zu erstellen, bei dem das "Übereinstimmungsattribut" auf das Element-Tag festgelegt ist, nach dem Sie suchen, und das Attribut "Verwenden" als Index.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

<xsl:key name="belege-by-store" match="Belege" use="Store" /> 

<xsl:template match="/Einreichung"> 
    <xsl:apply-templates select="EinreichZahlung/EinreichZahlungen" /> 
</xsl:template> 


<xsl:template match="EinreichZahlungen"> 
    <pre> 
    <b> 
     <xsl:value-of select="MemberFirstName" /><xsl:text> </xsl:text> 
     <xsl:value-of select="MemberLastName" /><xsl:text> </xsl:text> 
     <xsl:value-of select="key('belege-by-store', Store)/MemberFirstName" /> 
    </b> 
    </pre> 
</xsl:template> 
</xsl:stylesheet> 

eine Variable Definition in Lesbarkeit helfen kann (verwendet Belege [1], wie Sie 2 Belege Knoten für Shop 180, zu haben scheinen, obwohl thq Frage für die Verschmelzung von 2 Knoten fragt)

<xsl:template match="EinreichZahlungen"> 
<xsl:variable name="belegeNodes">  
<xsl:copy-of select="key('belege-by-store', Store)" /> 
</xsl:variable> 
    <pre> 
    <b> 
    <xsl:value-of select="MemberFirstName" /> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="MemberLastName" /> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="$belegeNodes/Belege[1]/MemberFirstName" />  
    </b> 
    </pre> 
</xsl:template> 

Update:

Sie können jeden Beleg mit so etwas wie verarbeiten:

<xsl:for-each select="key('belege-by-store', Store)"> 
<tr><td><xsl:value-of select="MemberFirstName" /> 
</td></tr> 
</xsl:for-each> 

oder (mit einer anderen Vorlage für Belege)

<xsl:apply-templates select="key('belege-by-store', Store)"> 
+0

Vielen Dank @Lesiak, es hat Ihrer Lösung wirklich geholfen. – ttdol2506

+0

Kannst du mir auch noch weiterhelfen - die 2 Werte von Belege - ich brauche beide in meinem HTML-Dokument (ich habe sie in einer Tabelle angeordnet). Das Problem ist, dass ich die Werte in der Tabelle in verschiedenen Zeilen trennen muss. – ttdol2506

+0

Ein Update hinzugefügt – Lesiak