在XSLT中合并两个节点

在XSLT中合并两个节点

问题描述:

几天来,我一直在努力为这个问题找到解决方案。 我有这样的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新手,所以我会很感激的帮助。

在处理节点时,可以使用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