如何获取当前元素属性
How to get current element attribute
XSL 用于反规范化 XML 以导入平面数据库 table。
对于每个发票,invoiceid 列必须包含此发票 ID。
但是由于未知原因
<xsl:value-of select="../../../../../../Invoice/@invoiceId"/>
returns 总是在 arvenumber 元素中第一个发票 ID 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:
<?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解析器用于转换
如果您想要最近的封闭发票元素上的发票 ID,请尝试编写 ancestor::Invoice[1]/@invoiceId
而不是 ../../../../../../Invoice/@invoiceId
。
您显示的 XPath 费力地爬上 XML 元素树,直到它到达 E_Invoice 元素(即六重 ..
),然后下降到名为的元素的子元素发票及其 invoiceId 属性。由于有许多 Invoice 元素是 E_Invoice 的子元素,显示的 XPath 表达式的值是一组属性节点。由于 xsl:value-of
只需要一个值,因此它采用第一个值并丢弃其余值。
避免这个问题的关键是避免爬上你想要的 Invoice 元素,因为那样你必须爬回来,你怎么知道你真正想要的许多 Invoice 元素中的哪一个?祖先轴允许您爬升到 Invoice 元素,而不是更进一步,从而避免了关于您想要哪个 Invoice 元素的任何歧义:您想要的是当前节点的祖先元素。
XSL 用于反规范化 XML 以导入平面数据库 table。
对于每个发票,invoiceid 列必须包含此发票 ID。
但是由于未知原因
<xsl:value-of select="../../../../../../Invoice/@invoiceId"/>
returns 总是在 arvenumber 元素中第一个发票 ID 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:
<?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解析器用于转换
如果您想要最近的封闭发票元素上的发票 ID,请尝试编写 ancestor::Invoice[1]/@invoiceId
而不是 ../../../../../../Invoice/@invoiceId
。
您显示的 XPath 费力地爬上 XML 元素树,直到它到达 E_Invoice 元素(即六重 ..
),然后下降到名为的元素的子元素发票及其 invoiceId 属性。由于有许多 Invoice 元素是 E_Invoice 的子元素,显示的 XPath 表达式的值是一组属性节点。由于 xsl:value-of
只需要一个值,因此它采用第一个值并丢弃其余值。
避免这个问题的关键是避免爬上你想要的 Invoice 元素,因为那样你必须爬回来,你怎么知道你真正想要的许多 Invoice 元素中的哪一个?祖先轴允许您爬升到 Invoice 元素,而不是更进一步,从而避免了关于您想要哪个 Invoice 元素的任何歧义:您想要的是当前节点的祖先元素。