2016-07-02 21 views
-1

XSL wird verwendet, um XML für den Import in eine flache Datenbanktabelle zu de-normalisieren.So erhalten Sie das aktuelle Elementattribut

Für jede Rechnung muss die Spalte rechnungsID diese Rechnungs-ID enthalten.

jedoch aus unbekannten Gründen

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

kehren immer an erster Stelle Rechnung ID 1605002 in arvenumber Elemente. Also haben alle Zeilen dieselbe ID. Wie zu beheben?

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:

<?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-Parser für die Umwandlung

+2

Ich sehe "Accounting" nicht in Ihrem XML – SomeDude

Antwort

1

verwendet wird Wenn Sie die InvoiceID auf der nächsten einschließeRechnungsElement, versuchen ancestor::Invoice[1]/@invoiceId statt ../../../../../../Invoice/@invoiceId schreiben .

Der XPath, den Sie anzeigen, steigt mühsam den XML-Elementbaum hinauf, bis er das E_Invoice-Element erreicht (das ist das Sechsfache ..) und dann zu den untergeordneten Elementen dieses Elements mit dem Namen Invoice und den Attributen invoiceId absteigt. Da es viele Invoice-Elemente gibt, die untergeordnete Elemente von E_Invoice sind, ist der Wert des angezeigten XPath-Ausdrucks ein Satz von Attributknoten. Da xsl:value-of nur einen Wert haben will, nimmt es den ersten und wirft den Rest weg.

Der Schlüssel zur Vermeidung dieses Problems besteht darin, nicht über das gewünschte Rechnungselement hinauszuklettern, denn dann müssen Sie wieder nach unten klettern, und wie werden Sie wissen, welches der vielen Rechnungelemente Sie tatsächlich wollen? Die Vorgängerachse ermöglicht es Ihnen, auf das Rechnung-Element und nicht weiter zu steigen, und vermeidet so Unklarheiten darüber, welches Rechnungselement Sie haben möchten: Sie wollen denjenigen, der der Vorgänger des aktuellen Knotens ist.

Verwandte Themen