如何在xslt v2.0.0

时间:2017-02-20 13:41:39

标签: xslt xslt-2.0 xslt-grouping

我不知道如何把正确的标题。我正在使用一个关键功能来分组元素。我需要为BnkAcct / BBANID和XSeq / Seq的每个唯一值创建<Acct>标记。但是,如果元素位于另一个元素内,则无法获得元素的特定值。这是我的XML文件:

<XMLFile>
<Hdr>
    <DctID>
        <ID>2017-02-20ZTenantID</ID>
    </DctID>
    <Dscpt>Slovenska</Dscpt>
</Hdr>
<Acct>
    <LNo>1</LNo>
    <XSeq>
        <Seq>111</Seq>
    </XSeq>
    <Prd>
        <SDT>21.03.2016</SDT>
        <EDT>21.03.2016</EDT>
    </Prd>
    <BnkAcct>
        <BBANID>AAA111</BBANID>
    </BnkAcct>
    <Entry>
        <Amt>4.42</Amt>
        <Dtl>
            <No>1</No>
            <Amt>122.43</Amt>
        </Dtl>
    </Entry>
</Acct>
<Acct>
    <LNo>1</LNo>
    <XSeq>
        <Seq>444</Seq>
    </XSeq>
    <Prd>
        <SDT>21.06.2016</SDT>
        <EDT>21.06.2016</EDT>
    </Prd>
    <BnkAcct>
        <BBANID>DDD444</BBANID>
    </BnkAcct>
    <Entry>
        <Amt>94.32</Amt>
        <Dtl>
            <No>4</No>
            <Amt>852.11</Amt>
        </Dtl>
    </Entry>
</Acct>
<Acct>
        <LNo>1</LNo>
    <XSeq>
        <Seq>444</Seq>
    </XSeq>
    <Prd>
        <SDT>21.06.1999</SDT>
        <EDT>21.06.2001</EDT>
    </Prd>
    <BnkAcct>
        <BBANID>DDD444</BBANID>
    </BnkAcct>
    <Entry>
        <Amt>2332.353</Amt>
        <Dtl>
            <No>5</No>
            <Amt>23422.31</Amt>
        </Dtl>
    </Entry>
</Acct>
</XMLFile>

我的XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="Header2" match="Acct" use="concat(BBANID, '|', Seq)"/>
<xsl:template match="/XMLFile">
    <xsl:copy>
        <xsl:copy-of select="Hdr"/>
        <xsl:apply-templates select="Acct[generate-id() = generate-id(key('Header2', concat(BBANID, '|', Seq))[1])]" mode="Header2"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="Acct" mode="Header2">
    <BankStatementAccount>
        <xsl:copy-of select="LNo|Seq|Prd|ID"/>
        <xsl:apply-templates select="key('Header2', concat(BBANID, '|', Seq))"/>
    </BankStatementAccount>
</xsl:template>
<xsl:template match="Acct">
    <xsl:copy-of select="Entry"/>
</xsl:template>
</xsl:stylesheet>

预期产出:

<XMLFile>
<Hdr>
    <DctID>
        <ID>2017-02-20ZTenantID</ID>
    </DctID>
    <Dscpt>Slovenska</Dscpt>
</Hdr>
<Acct>
    <LNo>1</LNo>
    <XSeq>
        <Seq>111</Seq>
    </XSeq>
    <Prd>
        <SDT>21.03.2016</SDT>
        <EDT>21.03.2016</EDT>
    </Prd>
    <BnkAcct>
        <BBANID>AAA111</BBANID>
    </BnkAcct>
    <Entry>
        <Amt>4.42</Amt>
        <Dtl>
            <No>1</No>
            <Amt>122.43</Amt>
        </Dtl>
    </Entry>
</Acct>
<Acct>
    <LNo>1</LNo>
    <XSeq>
        <Seq>444</Seq>
    </XSeq>
    <Prd>
        <SDT>21.06.2016</SDT>
        <EDT>21.06.2016</EDT>
    </Prd>
    <BnkAcct>
        <BBANID>DDD444</BBANID>
    </BnkAcct>
    <Entry>
        <Amt>94.32</Amt>
        <Dtl>
            <No>4</No>
            <Amt>852.11</Amt>
        </Dtl>
    </Entry>
    <Entry>
        <Amt>2332.353</Amt>
        <Dtl>
            <No>5</No>
            <Amt>23422.31</Amt>
        </Dtl>
    </Entry>
</Acct>
</XMLFile>

XSLT不起作用可能是因为我使用的属性? BBANID来自<BnkAcct>,Seq来自<XSeq>。如果它在另一个元素中,我将如何使用use属性中的特定元素?

顺便说一下,如果我删除了<BnkAcct>代码和<XSeq>代码,那么XSLT就会正常工作,但这是错误的。

谢谢。

1 个答案:

答案 0 :(得分:0)

主题讨论XSLT 2但代码版本为1.0。对于key问题,<xsl:key name="Header2" match="Acct" use="concat(BBANID, '|', Seq)"/>我认为您需要<xsl:key name="Header2" match="Acct" use="concat(.//BBANID, '|', .//Seq)"/><xsl:key name="Header2" match="Acct" use="concat(BnkAcct/BBANID, '|', XSeq/Seq)"/>,以匹配输入XML。