2016-07-02 12 views
-1

XSLは、フラットデータベーステーブルにインポートするためにXMLを逆正規化するために使用されます。現在の要素属性を取得する方法

すべての請求書の請求書の列には、この請求書IDが含まれている必要があります。

しかし

<xsl:value-of select="../../../../../../Invoice/@invoiceId"/> 

戻り、常に未知の理由のためにarvenumber要素の最初の請求書番号1605002。したがって、すべての行は同じIDを持ちます。 修正方法?

XML:

<?xml version="1.0" encoding="windows-1257"?> 

<Envelope> 
    <Body> 
    <BuyInvoicesResponse> 
     <E_Invoice> 
     <Invoice invoiceId='1605002'> 
      <InvoiceItem> 
      <InvoiceItemGroup> 
       <ItemEntry> 
       <SellerProductId>YEYLD</SellerProductId> 
       <Description>Üldelekter</Description> 
       <EAN>23225325</EAN> 
       <ItemDetailInfo> 
        <ItemUnit>m2</ItemUnit> 
        <ItemAmount>1.96</ItemAmount> 
        <ItemPrice>1</ItemPrice> 
       </ItemDetailInfo> 
       <ItemSum>1.96</ItemSum> 
       <VAT> 
        <SumBeforeVAT>1.96</SumBeforeVAT> 
        <VATRate>0.00</VATRate> 
        <VATSum>0.00</VATSum> 
       </VAT> 
       <ItemTotal>1.96</ItemTotal> 
       </ItemEntry> 
       <ItemEntry> 
       <SellerProductId>YKV</SellerProductId> 
       <Description>Vesi ja kanalisatsioon</Description> 
       <EAN></EAN> 
       <ItemDetailInfo> 
        <ItemUnit>m3</ItemUnit> 
        <ItemAmount>4.10</ItemAmount> 
        <ItemPrice>2.07600</ItemPrice> 
       </ItemDetailInfo> 
       <ItemSum>8.51</ItemSum> 
       <VAT> 
        <SumBeforeVAT>8.51</SumBeforeVAT> 
        <VATRate>0.00</VATRate> 
        <VATSum>0.00</VATSum> 
       </VAT> 
       <ItemTotal>8.51</ItemTotal> 
       </ItemEntry> 
       <ItemEntry> 
       <SellerProductId>YPRYGI</SellerProductId> 
       <Description>Prügivedu</Description> 
       <EAN></EAN> 
       <ItemDetailInfo> 
        <ItemUnit>m2</ItemUnit> 
        <ItemAmount>1.84</ItemAmount> 
        <ItemPrice>1</ItemPrice> 
       </ItemDetailInfo> 
       <ItemSum>1.84</ItemSum> 
       <VAT> 
        <SumBeforeVAT>1.84</SumBeforeVAT> 
        <VATRate>0.00</VATRate> 
        <VATSum>0.00</VATSum> 
       </VAT> 
       <ItemTotal>1.84</ItemTotal> 
       </ItemEntry> 
       <ItemEntry> 
       <SellerProductId>YSV</SellerProductId> 
       <Description>Vee soojendamine</Description> 
       <EAN></EAN> 
       <ItemDetailInfo> 
        <ItemUnit>m3</ItemUnit> 
        <ItemAmount>1.50</ItemAmount> 
        <ItemPrice>2.10600</ItemPrice> 
       </ItemDetailInfo> 
       <ItemSum>3.16</ItemSum> 
       <VAT> 
        <SumBeforeVAT>3.16</SumBeforeVAT> 
        <VATRate>0.00</VATRate> 
        <VATSum>0.00</VATSum> 
       </VAT> 
       <ItemTotal>3.16</ItemTotal> 
       </ItemEntry> 
      </InvoiceItemGroup> 
      </InvoiceItem> 
     </Invoice> 
     <Invoice invoiceId='1605006'> 
      <InvoiceItem> 
      <InvoiceItemGroup> 
       <ItemEntry> 
       <SellerProductId>YEYLD</SellerProductId> 
       <Description>Üldelekter</Description> 
       <EAN>23225325</EAN> 
       <ItemDetailInfo> 
        <ItemUnit>m2</ItemUnit> 
        <ItemAmount>2.50</ItemAmount> 
        <ItemPrice>1</ItemPrice> 
       </ItemDetailInfo> 
       <ItemSum>2.50</ItemSum> 
       <VAT> 
        <SumBeforeVAT>2.50</SumBeforeVAT> 
        <VATRate>0.00</VATRate> 
        <VATSum>0.00</VATSum> 
       </VAT> 
       <ItemTotal>2.50</ItemTotal> 
       </ItemEntry> 
      </InvoiceItemGroup> 
      </InvoiceItem> 
     </Invoice> 
     </E_Invoice> 

    </BuyInvoicesResponse> 
    </Body> 
</Envelope> 

XSL:あなたは、最寄り囲む請求書要素にInvoiceIDをしたい場合は

<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes"/> 
    <xsl:template match="/"> 
    <xsl:element name="VFPData"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="/Envelope/Body/BuyInvoicesResponse/E_Invoice/Invoice/InvoiceItem/InvoiceItemGroup/ItemEntry/Accounting/*"> 
    <xsl:element name="Document-BuyInvoice"> 
     <xsl:element name="arvenumber"> 
     <xsl:value-of select="../../../../../../Invoice/@invoiceId"/> 
     </xsl:element> 
     <xsl:element name="nimetus"> 
     <xsl:value-of select="../../Description"/> 
     </xsl:element> 
    </xsl:element> 
    </xsl:template> 

    <!-- to ommit nodes data --> 
    <xsl:template match="text()"> 
    </xsl:template> 

    <!-- to work over every node --> 
    <xsl:template match="*"> 
    <xsl:apply-templates/> 
    </xsl:template> 

</xsl:stylesheet> 

MSXMLパーサーが変換

+2

あなたのxmlに 'Accounting'が表示されません – SomeDude

答えて

1

のために使用され、../../../../../../Invoice/@invoiceIdの代わりにancestor::Invoice[1]/@invoiceIdを書いてみてください。

あなたが表示するXPathは、E_Invoice要素(これは、6倍の..です)に到達するまで、面倒なことにXML要素ツリーを上ってから、Invoiceという要素の子に降りて、invoiceId属性に降ります。 E_Invoiceの子であるInvoice要素が多数あるため、表示されるXPath式の値は属性ノードの集合です。 xsl:value-ofは1つの値しか求めていないので、最初の値をとり、残りの値をスローします。

この問題を回避するには、元に戻す必要があるため、必要な請求書要素を上るのを避けることが重要です。実際に何個の請求書要素のどれを知りたいのですか?先祖の軸を使用すると、Invoice要素に登ることができます。これにより、現在のノードの祖先である欲しいInvoice要素についてのあいまいさを避けることができます。

関連する問題