如何解决XSLT:将XML属性转换为元素,然后将该值填充到孙节点
我一直在使用Power Query,并且所有xml转换都工作正常,因为数据太重,我们决定进行ms访问,这时遇到麻烦,最终我得到了几个没有关系的表。为了实现os匹配实体的目的,我首先需要将父属性 uid 转换为一个元素,然后需要将该元素填充到一个名为 tender 的大子节点中。
我需要的是每个集成的新元素,每个子节点和大子节点中的记录 uid 4513171998
例如,将IntegrationRecord uid 4513171998 粘贴为招标中的元素
我一直在阅读所有文章并尝试每种可行的解决方案,问题似乎出在属性上,尽管我确实可以应用于其他元素,但不适用于这些特定元素。
这是我的XML代码
<message:integrationMessage
xmlns:moneywithdrawal="http://www.cccccinformatica.com/ccccc/integration/moneywithdrawal"
xmlns:accountingmodel="http://www.cccccinformatica.com/ccccc/integration/accountingmodel"
xmlns:catalog="http://www.cccccinformatica.com/ccccc/integration/catalog"
xmlns:rule="http://www.cccccinformatica.com/ccccc/integration/rule"
xmlns:supportfamily="http://www.cccccinformatica.com/ccccc/integration/supportfamily"
xmlns:message="http://www.cccccinformatica.com/ccccc/integration/message" xmlns:inventory="http://www.cccccinformatica.com/ccccc/integration/inventory" xmlns:sales="http://www.cccccinformatica.com/ccccc/integration/sales" xmlns:dictionary="http://www.cccccinformatica.com/ccccc/integration/dictionary" xmlns:orders="http://www.cccccinformatica.com/ccccc/integration/orders" xmlns:constants="http://www.cccccinformatica.com/ccccc/integration/constants" xmlns:invoice="http://www.cccccinformatica.com/ccccc/integration/invoice" xmlns:prices="http://www.cccccinformatica.com/ccccc/integration/prices" xmlns:support="http://www.cccccinformatica.com/ccccc/integration/support" xmlns:operation="http://www.cccccinformatica.com/ccccc/integration/operation" xmlns:promotion="http://www.cccccinformatica.com/ccccc/integration/promotion" xmlns:customer="http://www.cccccninformatica.com/ccccc/integration/customer" companyId="117657304" messageId="200202007301901247790000000560" processType="SALES_DETAIL">
<message:integrationRecords>
<message:integrationRecord action="CREATION" uid="4513171998">
<sales:transactionalEvent>
<storeCode>15</storeCode>
<companyStoreCode>15</companyStoreCode>
<cashier>000001</cashier>
<date>2020-07-26T22:17:29</date>
<register>1</register>
<posId>3406443</posId>
<transactionType>SALE</transactionType>
<transactionNature>STANDARD</transactionNature>
<journalClose>
<businessDate>2020-07-27</businessDate>
<zone>1</zone>
<shift>1</shift>
<sequentialNumber>20200727001</sequentialNumber>
</journalClose>
<summary>
<transactionTotalTaxSaleAmount>0.22</transactionTotalTaxSaleAmount>
<transactionTotalTaxNetAmount>2.18</transactionTotalTaxNetAmount>
<transactionTotalGrandAmount>2.4</transactionTotalGrandAmount>
</summary>
<documents>
<transactionDocument>
<documentSerial>TICKET</documentSerial>
<documentNumber>109340160</documentNumber>
<type>Ticket</type>
<dateOfEmission>2020-07-26</dateOfEmission>
<kindOfInvoice>NonCommision</kindOfInvoice>
<issuerId></issuerId>
<issuerAlias></issuerAlias>
</transactionDocument>
</documents>
<lines>
<transactionLine uid="4513172002">
<type>ItemLine</type>
<lineIndex>0</lineIndex>
<salesQuantity>1</salesQuantity>
<actualSalesPrice>1.2</actualSalesPrice>
<salesAmount>1.2</salesAmount>
<unitCostAmount>0.587</unitCostAmount>
<totalCostAmount>0.587</totalCostAmount>
<vatQuoteAmount>0.109091</vatQuoteAmount>
<indQuoteAmount>0</indQuoteAmount>
<baseAmount>1.090909</baseAmount>
<family>13</family>
<subFamily>1301</subFamily>
<category>130101</category>
<productCode>13000002</productCode>
<productDescription>HALLS/VITA-C VARIOS 32GR</productDescription>
<salesMan>000001_110</salesMan>
<hasCommission>false</hasCommission>
<transactionLineDate>2020-07-26T22:17:20</transactionLineDate>
<documentSerial>TICKET</documentSerial>
<documentNumber>109340160</documentNumber>
<itemTaxes>
<itemTax>
<taxLevel>2</taxLevel>
<taxCollectedAmount>0.11</taxCollectedAmount>
<taxValue>10</taxValue>
<baseAmount>1.090909</baseAmount>
</itemTax>
</itemTaxes>
</transactionLine>
<transactionLine uid="4513172004">
<type>ItemLine</type>
<lineIndex>1</lineIndex>
<salesQuantity>1</salesQuantity>
<actualSalesPrice>1.2</actualSalesPrice>
<salesAmount>1.2</salesAmount>
<unitCostAmount>0.587</unitCostAmount>
<totalCostAmount>0.587</totalCostAmount>
<vatQuoteAmount>0.109091</vatQuoteAmount>
<indQuoteAmount>0</indQuoteAmount>
<baseAmount>1.090909</baseAmount>
<family>13</family>
<subFamily>1301</subFamily>
<category>130101</category>
<productCode>13000002</productCode>
<productDescription>HALLS/VITA-C VARIOS 32GR</productDescription>
<salesMan>000001_110</salesMan>
<hasCommission>false</hasCommission>
<transactionLineDate>2020-07-26T22:17:21</transactionLineDate>
<documentSerial>TICKET</documentSerial>
<documentNumber>109340160</documentNumber>
<itemTaxes>
<itemTax>
<taxLevel>2</taxLevel>
<taxCollectedAmount>0.11</taxCollectedAmount>
<taxValue>10</taxValue>
<baseAmount>1.090909</baseAmount>
</itemTax>
</itemTaxes>
</transactionLine>
</lines>
<tenders>
<tender>
<tenderAmount>2.4</tenderAmount>
<tenderType>localCurrency</tenderType>
<tenderTypeName>EFECTIVO</tenderTypeName>
<tenderTypeCategory>cash</tenderTypeCategory>
<currency>EUR</currency>
</tender>
</tenders>
<taxes>
<transactionTax>
<taxableSalesAmount>2.4</taxableSalesAmount>
<taxCollectedAmount>0.22</taxCollectedAmount>
<taxLevel>2</taxLevel>
</transactionTax>
</taxes>
</sales:transactionalEvent>
</message:integrationRecord>
<message:integrationRecord action="CREATION" uid="4513172025">
<sales:transactionalEvent>
<storeCode>15</storeCode>
<companyStoreCode>15</companyStoreCode>
<cashier>000001</cashier>
<date>2020-07-26T22:19:11</date>
<register>1</register>
<posId>3406444</posId>
<transactionType>SALE</transactionType>
<transactionNature>STANDARD</transactionNature>
<journalClose>
<businessDate>2020-07-27</businessDate>
<zone>1</zone>
<shift>1</shift>
<sequentialNumber>20200727001</sequentialNumber>
</journalClose>
<summary>
<transactionTotalTaxSaleAmount>1.04</transactionTotalTaxSaleAmount>
<transactionTotalTaxNetAmount>4.96</transactionTotalTaxNetAmount>
<transactionTotalGrandAmount>6</transactionTotalGrandAmount>
</summary>
<documents>
<transactionDocument>
<documentSerial>TICKET</documentSerial>
<documentNumber>109340161</documentNumber>
<type>Ticket</type>
<dateOfEmission>2020-07-26</dateOfEmission>
<kindOfInvoice>NonCommision</kindOfInvoice>
<issuerId></issuerId>
<issuerAlias></issuerAlias>
</transactionDocument>
</documents>
<lines>
<transactionLine uid="4513172029">
<type>ItemLine</type>
<lineIndex>0</lineIndex>
<salesQuantity>1</salesQuantity>
<actualSalesPrice>6</actualSalesPrice>
<salesAmount>6</salesAmount>
<unitCostAmount>4.297521</unitCostAmount>
<totalCostAmount>4.297521</totalCostAmount>
<vatQuoteAmount>1.041322</vatQuoteAmount>
<indQuoteAmount>0</indQuoteAmount>
<baseAmount>4.958678</baseAmount>
<family>23</family>
<subFamily>2305</subFamily>
<category>230520</category>
<productCode>23030005</productCode>
<productDescription>PUEBLO 30G FINE LIAR</productDescription>
<salesMan>000001_110</salesMan>
<hasCommission>false</hasCommission>
<transactionLineDate>2020-07-26T22:18:37</transactionLineDate>
<documentSerial>TICKET</documentSerial>
<documentNumber>109340161</documentNumber>
<itemTaxes>
<itemTax>
<taxLevel>3</taxLevel>
<taxCollectedAmount>1.04</taxCollectedAmount>
<taxValue>21</taxValue>
<baseAmount>4.958678</baseAmount>
</itemTax>
</itemTaxes>
</transactionLine>
</lines>
<tenders>
<tender>
<tenderAmount>6</tenderAmount>
<tenderType>localCurrency</tenderType>
<tenderTypeName>EFECTIVO</tenderTypeName>
<tenderTypeCategory>cash</tenderTypeCategory>
<currency>EUR</currency>
</tender>
</tenders>
<taxes>
<transactionTax>
<taxableSalesAmount>6</taxableSalesAmount>
<taxCollectedAmount>1.04</taxCollectedAmount>
<taxLevel>3</taxLevel>
</transactionTax>
</taxes>
</sales:transactionalEvent>
</message:integrationRecord>
</message:integrationRecords>
</message:integrationMessage>
XSLT代码
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<dataroot>
<xsl:apply-templates select="@*|node()"/>
</dataroot>
</xsl:template>
<!-- DONDE LO APLICO -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- attributes to elements DE DONDE LO EXTRAIGO -->
<xsl:template match="@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="transactionalEvent">
<transactionalEvent>
<uid><xsl:value-of select="../../uid"/></uid> <!---->
<xsl:apply-templates select="@*|node()"/>
</transactionalEvent>
</xsl:template>
</xsl:stylesheet>
我想在新创建的元素uid下看不到任何信息。
输出应该如何:
xmlns:customer="http://www.cccccninformatica.com/ccccc/integration/customer" companyId="117657304" messageId="200202007301901247790000000560" processType="SALES_DETAIL">
<message:integrationRecords>
<message:integrationRecord action="CREATION" **uid="4513171998"**>
<sales:transactionalEvent>
<storeCode>15</storeCode>
<companyStoreCode>15</companyStoreCode>
<cashier>000001</cashier>
<date>2020-07-26T22:17:29</date>
<register>1</register>
<posId>3406443</posId>
<transactionType>SALE</transactionType>
<transactionNature>STANDARD</transactionNature>
<journalClose>
<businessDate>2020-07-27</businessDate>
<zone>1</zone>
<shift>1</shift>
<sequentialNumber>20200727001</sequentialNumber>
</journalClose>
<summary>
<transactionTotalTaxSaleAmount>0.22</transactionTotalTaxSaleAmount>
<transactionTotalTaxNetAmount>2.18</transactionTotalTaxNetAmount>
<transactionTotalGrandAmount>2.4</transactionTotalGrandAmount>
</summary>
<documents>
<transactionDocument>
-----> <uid>4513171998</uid>
<documentSerial>TICKET</documentSerial>
<documentNumber>109340160</documentNumber>
<type>Ticket</type>
<dateOfEmission>2020-07-26</dateOfEmission>
<kindOfInvoice>NonCommision</kindOfInvoice>
<issuerId></issuerId>
<issuerAlias></issuerAlias>
</transactionDocument>
</documents>
<lines>
<transactionLine uid="4513172002">
-----> <uid>4513171998</uid>
<type>ItemLine</type>
<lineIndex>0</lineIndex>
<salesQuantity>1</salesQuantity>
<actualSalesPrice>1.2</actualSalesPrice>
<salesAmount>1.2</salesAmount>
<unitCostAmount>0.587</unitCostAmount>
<totalCostAmount>0.587</totalCostAmount>
<vatQuoteAmount>0.109091</vatQuoteAmount>
<indQuoteAmount>0</indQuoteAmount>
<baseAmount>1.090909</baseAmount>
<family>13</family>
<subFamily>1301</subFamily>
<category>130101</category>
<productCode>13000002</productCode>
<productDescription>HALLS/VITA-C VARIOS 32GR</productDescription>
<salesMan>000001_110</salesMan>
<hasCommission>false</hasCommission>
<transactionLineDate>2020-07-26T22:17:20</transactionLineDate>
<documentSerial>TICKET</documentSerial>
<documentNumber>109340160</documentNumber>
<itemTaxes>
<itemTax>
**<uid>4513171998</uid>**
<taxLevel>2</taxLevel>
<taxCollectedAmount>0.11</taxCollectedAmount>
<taxValue>10</taxValue>
<baseAmount>1.090909</baseAmount>
</itemTax>
</itemTaxes>
</transactionLine>
<transactionLine uid="4513172004">
<type>ItemLine</type>
<lineIndex>1</lineIndex>
<salesQuantity>1</salesQuantity>
<actualSalesPrice>1.2</actualSalesPrice>
<salesAmount>1.2</salesAmount>
<unitCostAmount>0.587</unitCostAmount>
<totalCostAmount>0.587</totalCostAmount>
<vatQuoteAmount>0.109091</vatQuoteAmount>
<indQuoteAmount>0</indQuoteAmount>
<baseAmount>1.090909</baseAmount>
<family>13</family>
<subFamily>1301</subFamily>
<category>130101</category>
<productCode>13000002</productCode>
<productDescription>HALLS/VITA-C VARIOS 32GR</productDescription>
<salesMan>000001_110</salesMan>
<hasCommission>false</hasCommission>
<transactionLineDate>2020-07-26T22:17:21</transactionLineDate>
<documentSerial>TICKET</documentSerial>
<documentNumber>109340160</documentNumber>
<itemTaxes>
<itemTax>
<taxLevel>2</taxLevel>
<taxCollectedAmount>0.11</taxCollectedAmount>
<taxValue>10</taxValue>
<baseAmount>1.090909</baseAmount>
</itemTax>
</itemTaxes>
</transactionLine>
</lines>
<tenders>
<tender>
-----> <uid>4513171998</uid>
<tenderAmount>2.4</tenderAmount>
<tenderType>localCurrency</tenderType>
<tenderTypeName>EFECTIVO</tenderTypeName>
<tenderTypeCategory>cash</tenderTypeCategory>
<currency>EUR</currency>
</tender>
</tenders>
<taxes>
<transactionTax>
<taxableSalesAmount>2.4</taxableSalesAmount>
<taxCollectedAmount>0.22</taxCollectedAmount>
<taxLevel>2</taxLevel>
</transactionTax>
</taxes>
</sales:transactionalEvent>
</message:integrationRecord>
解决方法
如前所述,为了访问基础名称空间前缀(即prefix:local-name
)中的任何节点,您需要在XSLT中声明的前缀。仅以其本地名称进行引用是不够的。另外,要访问属性,需要使用@
前缀。
下面的调整现在应在uid
下为<sales:transactionalEvent>
创建一个新元素
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sales="http://www.cccccinformatica.com/ccccc/integration/sales">
...same code..
<xsl:template match="sales:transactionalEvent">
<transactionalEvent>
<uid><xsl:value-of select="../@uid"/></uid>
<xsl:apply-templates select="@*|node()"/>
</transactionalEvent>
</xsl:template>
<xsl:stylesheet>
但是,考虑使用ancestor::
,并将模板扩展到其他需要的节点,以在MS Access数据库导入中进行正确的密钥匹配。请注意,message
前缀也是如何声明的。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:message = "http://www.cccccinformatica.com/ccccc/integration/message"
xmlns:sales = "http://www.cccccinformatica.com/ccccc/integration/sales">
...same code...
<xsl:template match="sales:transactionalEvent|transactionDocument|tender|transactionTax">
<xsl:copy>
<uid><xsl:value-of select="ancestor::message:integrationRecord/@uid"/></uid>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:stylesheet>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。