需要识别重复的 Xpath 值,然后只打印一次

问题描述 投票:0回答:1

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

但是这里的逻辑明显有缺陷,不会给我预期的结果。任何关于从哪里开始的线索都将不胜感激。

*为了示例,对静态值和空格进行了硬编码。

xml xslt foreach xslt-1.0 xslt-2.0
1个回答
0
投票

你有一些语法错误,还有逻辑错误。试试这样:

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>&#10;</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>&#10;</xsl:text>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each-group>
 </xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.