2017-03-03 144 views
0

幾天來,我一直在努力爲這個問題找到解決方案。 我有這樣的XML:在XSLT中合併兩個節點

<?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>

我需要在這兩個節點合併成一個與XSLT基礎上,商店值,使最終的HTML看起來像這樣:

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

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

我是XSLT新手,所以我會很感激的幫助。

回答

0

在處理節點時,可以使用xpath表達式在xml樹中找到任何節點。爲了加快速度,最好創建一個關鍵字,將「匹配」屬性設置爲要查找的元素標記,並將「使用」屬性作爲索引。

<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> 

定義一個變量在易讀性可有助於(使用Belege [1]作爲你似乎對商店180 2個Belege節點,雖然THQ問題詢問用於合併2個節點)

<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> 

更新:

您可以處理每個Belege的東西,如:

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

或(與另一模板Belege)

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

非常感謝@Lesiak,它真的幫助你的解決方案。 – ttdol2506

+0

你還可以幫我多考慮一下 - 來自Belege的2個值 - 我需要它們都顯示在我的HTML文檔中(我將它們安排在表格中)。問題是我需要在不同行中的表中分隔值。 – ttdol2506

+0

添加了一個更新 – Lesiak