2017-02-20 3 views
0

올바른 제목을 어떻게 넣을지 모르겠습니다. 요소를 그룹화하는 데 핵심 기능을 사용하고 있습니다. BnkAcct/BBANID 및 XSeq/Seq의 모든 고유 값에 대해 <Acct> 태그를 만들어야합니다. 그러나 다른 요소 내에 있으면 요소의 특정 값을 가져올 수 없습니다.xslt v2.0.0에서 키 기능을 사용하는 방법

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

예상 출력 : XSLT 어쩌면 때문에 쓸모가 작동하지 않는

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

내가 사용하는 속성이 내 XML 파일입니다? 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)"/>을 입력해야한다고 생각합니다.