我的 XML 输出如下所示:
<Data>
<Payment>
<PayeeName>Jim</PayeeName>
<CheckNumber>1</CheckNumber>
<Account_group>
<Account_Number>123456789</Account_Number>
</Account_group>
</Payment>
<Payment>
<PayeeName>Alex</PayeeName>
<CheckNumber>2</CheckNumber>
<Account_group>
<Account_Number>123456789</Account_Number>
</Account_group>
</Payment>
<Payment>
<PayeeName>Zach</PayeeName>
<CheckNumber>3</CheckNumber>
<Account_group>
<Account_Number>555566666</Account_Number>
</Account_group>
</Payment>
</Data>
我需要把它变成这样:
Account 123456789
CheckNumber 1 Jim
CheckNumber 2 Alex
Account 555566666
CheckNumber 3 Zach
本质上,我需要编写 XSLT 来检测整个 XML 文件中何时存在重复的“Account_Number”,然后只打印一次该帐号。然后我需要在单个帐号行下多行打印与帐号关联的所有“付款”。可悲的是,我无法更改 XML 的输出方式以使其更容易。
我很难弄清楚从哪里开始。
我认为解决方案将从这样的事情开始:
<xsl:template match="Data">
<xsl:for-each select="Payment">
<xsl:call-template name="AccountHeader"/
<xsl:call-template name="DetailRecord"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="AccountHeader">
<xsl:for-each-group select="Account_group" group by="Account_Number">
<text>Account </text>
<xsl:value-of select="Account_Number"/>
<xsl:value-of select="$linefeed" />
</xsl:for-each-group>
</xsl:template>
<xsl:template name="DetailRecord">
<xsl:for-each select="Payment">
<text>CheckNumber </text>
<xsl:value-of select="CheckNumber"/>
<text> </text>
<xsl:value-of select="PayeeName"/>
<xsl:value-of select="$linefeed" />
</xsl:for-each>
</xsl:template>
但是这里的逻辑明显有缺陷,不会给我预期的结果。任何关于从哪里开始的线索都将不胜感激。
*为了示例,对静态值和空格进行了硬编码。
你有一些语法错误,还有逻辑错误。试试这样:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match="/Data">
<xsl:for-each-group select="Payment" group-by="Account_group/Account_Number">
<xsl:text>Account </xsl:text>
<xsl:value-of select="current-grouping-key()"/>
<xsl:text> </xsl:text>
<xsl:for-each select="current-group()">
<xsl:text>CheckNumber </xsl:text>
<xsl:value-of select="CheckNumber"/>
<xsl:text> </xsl:text>
<xsl:value-of select="PayeeName"/>
<xsl:text> </xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>