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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...