XSLT:将XML属性转换为元素,然后将该值填充到孙节点

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-