2016-07-02 268 views
-1

XSL用于对XML进行反规范化以导入到平面数据库表中。如何获取当前元素属性

对于每个发票invoiceid列都必须包含此发票ID。

但是由于未知原因,

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

回报总是第一张发票编号1605002的arvenumber元素。所以所有的行都有相同的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:

<?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属性。由于有许多Invoice元素是E_Invoice的子元素,所以显示的XPath表达式的值是一组属性节点。由于xsl:value-of只需要一个值,因此需要第一个值并将剩余的值丢掉。

避免这个问题的关键是避免爬过你想要的Invoice元素,因为那么你必须爬下来,你将如何知道你真正想要的许多Invoice元素中的哪一个?祖先轴允许您爬到Invoice元素,而不再进一步,从而避免了您想要哪个Invoice元素的任何歧义:您想要哪个是当前节点的祖先。