2012-05-17 4 views
1

내가 다른 XML 여기 https://stackoverflow.com/a/10629806/662877XSLT는 부모 - 자식 요소의 값

에서 사용되는 어떤 것을 같은 논리를 사용하려고하지만 의도 된 출력을 받고 있지 않다 기반으로 자식 요소를 제거합니다. // TERR = "KHM6"는 다음 제거하면

는 입력/2 개에서 이러한 요소 CreatePaymentItems 및 CreatePayExt을 제거하여 출력을 생성한다. 누군가 여기서 내가 누락 된 내용을 말해 줄 수 있습니까?

감사

XSLT :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match= 
"*[../TERR='KHM6']/CreatePaymentItems | *[../TERR='KHM6']/CreatePayExt"/> 
</xsl:stylesheet> 

샘플 입력 XML :

<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return"> 
    <TransactionType> 
    <PayLineItems> 
     <PayLineInsert> 
     <PAYTYPE>4</PAYTYPE> 
     <NUMBER>R2293416</NUMBER> 
     <SERIAL>3335889530</SERIAL> 
     <DOCDATE>05/03/2012</DOCDATE> 
     <ITEMNMBR>4NZ3330000010</ITEMNMBR> 
     <UNITPRCE>599.99</UNITPRCE> 
     <XTNDPRCE>599.99</XTNDPRCE> 
     <QUANTITY>1</QUANTITY> 
     <TAXAMNT>43.65</TAXAMNT> 
     <QTYONHND>1</QTYONHND> 
     <TERR>KHM6</TERR> 
     </PayLineInsert> 
    </PayLineItems> 
    <PayLineEXT> 
     <PAYTYPE>4</PAYTYPE> 
     <NUMBER>R2293416</NUMBER> 
     <LNITMSEQ>2293416</LNITMSEQ> 
    </PayLineEXT> 
    <CreatePaymentItems> 
     <CreatePaymentInsertRecord> 
     <INTERID>TOTM</INTERID> 
     <PAYTYPE>4</PAYTYPE> 
     <PAYNUMBER>R2293416</PAYNUMBER> 
     <DOCDATE>05/03/2012</DOCDATE> 
     <DOCAMOUNT>645.03</DOCAMOUNT> 
     <DOCNUMBER>2293416</DOCNUMBER> 
     </CreatePaymentInsertRecord> 
    </CreatePaymentItems> 
    <CreatePayExt> 
     <PAYTYPE>4</PAYTYPE> 
     <PAYNUMBER>R2293416</PAYNUMBER> 
     <SEQNUMBR>61261585</SEQNUMBR> 
    </CreatePayExt> 
    </TransactionType> 
</ns0:DocTran> 

예상 출력 XML :

0 1,238,326,
+1

시작 태그가'CreatePaymentInsertRecord'이지만 닫는 태그는'CreateSopPaymentInsertRecord'이므로 XML을 수정해야했습니다. 예상대로 다시 확인하고 싶을 수도 있습니다. –

+0

@ TimC : 편집 해 주셔서 감사합니다. – JohnXsl

답변

2

문제는 여기입니다 :

*[../TERR='KHM6']/CreatePaymentItems 

이 값 "KHM6"와 형제 TERR이있는 요소의 CreatePaymentItems 아이를 일치합니다.

제공된 XML 문서의 모든 형제 인 TERR은 자식이 없습니다. (잘 형성되는 수정)

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"*[PayLineItems/*/TERR = 'KHM6'] 
     /*[self::CreatePaymentItems or self::CreatePayExt]"/> 
</xsl:stylesheet> 

제공되는 XML 문서에 적용 : 여기

원하는 변화입니다

<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return"> 
    <TransactionType> 
     <PayLineItems> 
      <PayLineInsert> 
       <PAYTYPE>4</PAYTYPE> 
       <NUMBER>R2293416</NUMBER> 
       <SERIAL>3335889530</SERIAL> 
       <DOCDATE>05/03/2012</DOCDATE> 
       <ITEMNMBR>4NZ3330000010</ITEMNMBR> 
       <UNITPRCE>599.99</UNITPRCE> 
       <XTNDPRCE>599.99</XTNDPRCE> 
       <QUANTITY>1</QUANTITY> 
       <TAXAMNT>43.65</TAXAMNT> 
       <QTYONHND>1</QTYONHND> 
       <TERR>KHM6</TERR> 
      </PayLineInsert> 
     </PayLineItems> 
     <PayLineEXT> 
      <PAYTYPE>4</PAYTYPE> 
      <NUMBER>R2293416</NUMBER> 
      <LNITMSEQ>2293416</LNITMSEQ> 
     </PayLineEXT> 
     <CreatePaymentItems> 
      <CreatePaymentInsertRecord> 
       <INTERID>TOTM</INTERID> 
       <PAYTYPE>4</PAYTYPE> 
       <PAYNUMBER>R2293416</PAYNUMBER> 
       <DOCDATE>05/03/2012</DOCDATE> 
       <DOCAMOUNT>645.03</DOCAMOUNT> 
       <DOCNUMBER>2293416</DOCNUMBER> 
      </CreatePaymentInsertRecord> 
     </CreatePaymentItems> 
     <CreatePayExt> 
      <PAYTYPE>4</PAYTYPE> 
      <PAYNUMBER>R2293416</PAYNUMBER> 
      <SEQNUMBR>61261585</SEQNUMBR> 
     </CreatePayExt> 
    </TransactionType> 
</ns0:DocTran> 

원하는, 올바른 결과가 생성됩니다.

<ns0:DocTran xmlns:ns0="http://test.Schemas.Out_Return" doctype="Return"> 
    <TransactionType> 
     <PayLineItems> 
     <PayLineInsert> 
      <PAYTYPE>4</PAYTYPE> 
      <NUMBER>R2293416</NUMBER> 
      <SERIAL>3335889530</SERIAL> 
      <DOCDATE>05/03/2012</DOCDATE> 
      <ITEMNMBR>4NZ3330000010</ITEMNMBR> 
      <UNITPRCE>599.99</UNITPRCE> 
      <XTNDPRCE>599.99</XTNDPRCE> 
      <QUANTITY>1</QUANTITY> 
      <TAXAMNT>43.65</TAXAMNT> 
      <QTYONHND>1</QTYONHND> 
      <TERR>KHM6</TERR> 
     </PayLineInsert> 
     </PayLineItems> 
     <PayLineEXT> 
     <PAYTYPE>4</PAYTYPE> 
     <NUMBER>R2293416</NUMBER> 
     <LNITMSEQ>2293416</LNITMSEQ> 
     </PayLineEXT> 
    </TransactionType> 
</ns0:DocTran> 
+0

해결책 주셔서 감사합니다. 위의 솔루션에 대한 몇 가지 설명을 해줄 수 있습니까? 특히 'self'를 언제 어떻게 사용해야합니까? – JohnXsl

+1

@JohnXsl :'self ::'축은 현재 선택 범위를 좁히는 데 사용됩니다. 문서에서'X'와'Y' 요소를 모두 선택한다고 가정 해보십시오. 한가지 방법은 다음과 같은 표현식을 사용하는 것입니다 :'// X | // Y'하지만 이는 문서를 두 번 완전히 통과시킵니다. 더 좋은 방법은 다음과 같습니다 :'// * [self :: X or self :: Y]'이것은 문서를 한 번만 횡단하여 각 요소가 X인지 Y인지 검사합니다. –

+0

설명 해 주셔서 감사합니다 ...-) – JohnXsl

관련 문제