在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)">
非常感谢@Lesiak,它真的帮助你的解决方案。 – ttdol2506
你还可以帮我多考虑一下 - 来自Belege的2个值 - 我需要它们都显示在我的HTML文档中(我将它们安排在表格中)。问题是我需要在不同行中的表中分隔值。 – ttdol2506
添加了一个更新 – Lesiak