2016-07-02 6 views
-1

XSL используется для де-нормализации XML для импорта в плоскую таблицу базы данных.Как получить атрибут текущего элемента

Для каждого столбца счета-фактуры счет должен содержать этот идентификатор счета-фактуры.

Однако по неизвестной причине

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

возвращается всегда первый счет-фактура ID 1605002 в arvenumber элемента. Таким образом, все строки имеют одинаковый идентификатор. Как исправить?

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 синтаксический анализатор используется для преобразования

+2

Я не вижу 'Учет' в вашем xml – SomeDude

ответ

1

Если вы хотите InvoiceID на ближайший вмещающего элемента счета-фактуры, попытайтесь писать ancestor::Invoice[1]/@invoiceId вместо ../../../../../../Invoice/@invoiceId ,

XPath, который вы показываете, с трудом поднимается вверх по дереву элементов XML до тех пор, пока не достигнет элемента E_Invoice (это шестизначный ..), затем спускается к дочерним элементам этого элемента с именем Invoice и их атрибутами invoiceId. Поскольку существует много элементов счета-фактуры, которые являются дочерними элементами E_Invoice, значение отображаемого выражения XPath представляет собой набор узлов атрибутов. Поскольку xsl:value-of хочет только одно значение, он берет первый и отбрасывает остальных.

Ключом избежать этой проблемы является не добираться до элемента Invoice, который вы хотите, потому что тогда вам нужно спуститься вниз, и как вы узнаете, какой из многих элементов счета вы действительно хотите? Ось предка позволяет вам залезть в элемент счета и дальше, тем самым избегая какой-либо двусмысленности относительно того, какой элемент Invoice вы хотите: вам нужен тот, который является предком текущего узла.

 Смежные вопросы

  • Нет связанных вопросов^_^