2017-02-20 4 views
0

正しいタイトルをどのように置くのか分かりません。私は要素をグループ化するための主要な機能を使用しています。 BnkAcct/BBANIDとXSeq/Seqの一意の値ごとに<Acct>タグを作成する必要があります。しかし、ある要素が他の要素の中にあれば、その要素の特定の値を得ることはできません。これは私のXMLファイルです:xslt v2.0.0でkey関数を使用する方法

<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が動作していますが、これは間違っています。

ありがとうございます。

+0

XSLT 2.0を使用している場合、なぜ 'xsl:for-each-group'コマンドでグループ化していませんか? –

+0

@ michael.hor247k:オハイオ!申し訳ありませんが、わかりません。私はte webで見たアイデアをコピーしています。 – pinkpanther

答えて

0

件名はXSLT 2について語っていますが、コードのバージョンは1.0です。 key問題については、<xsl:key name="Header2" match="Acct" use="concat(BBANID, '|', Seq)"/>と入力XMLと一致するように<xsl:key name="Header2" match="Acct" use="concat(.//BBANID, '|', .//Seq)"/>または<xsl:key name="Header2" match="Acct" use="concat(BnkAcct/BBANID, '|', XSeq/Seq)"/>としたいと思います。

関連する問題