【问题标题】:Importing xml with nested nodes into Access (and needing to transform the xml into a 'flat' structure with xsl)将带有嵌套节点的 xml 导入 Access(并且需要使用 xsl 将 xml 转换为“平面”结构)
【发布时间】:2019-12-20 23:50:58
【问题描述】:

拼命尝试并将某些数据导入 Access 中失败,这些数据由各种嵌套节点组成,当我只想拥有一个时,这些嵌套节点在导入时被放入单独的表中。

我只想让包含嵌套节点中所有数据的 Activity 表位于此父表中。

我已经尝试调整之前类似问题的一些代码,但我的尝试似乎没有希望,因为它甚至没有从“Activity”表中提取任何信息,但是它在“CstActivity”表中创建了“AttID”字段我想我最终可以达到目的,以便跨表进行连接/链接。唯一的问题是它实际上并没有用相关的 id 填充它!

但理想情况下,我只想转换数据,以便导入仅包含“活动”节点上相关行中嵌套节点中的所有内容。

要导入的xml:


<?xml version="1.0" encoding="utf-8"?>
<ns:HCDSExtract xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="http://Improvement.nhs.uk/HealthcareCostingDataSet/v03-1819">
  <ns:MessageHeader>
    <ns:OrgSubmittingID>RRK</ns:OrgSubmittingID>
    <ns:FinYr>FY2018-19</ns:FinYr>
    <ns:PeriodStartDate>2018-05-01</ns:PeriodStartDate>
    <ns:PeriodEndDate>2018-05-31</ns:PeriodEndDate>
    <ns:CreateDateTime>2018-03-28T18:25:04</ns:CreateDateTime>
    <ns:FeedType>OP</ns:FeedType>
    <ns:NoOfActivityRecords>10</ns:NoOfActivityRecords>
    <ns:TotalCosts>100.000</ns:TotalCosts>
  </ns:MessageHeader>
  <ns:MessageBody>
    <ns:Activity>
      <ns:OrgId>RRK</ns:OrgId>
      <ns:CDSID>503898066984</ns:CDSID>
      <ns:NHSNo>1111111111</ns:NHSNo>
      <ns:NhsSt>01</ns:NhsSt>
      <ns:Postcd>RD15 2AD</ns:Postcd>
      <ns:DoB>1967-04-01</ns:DoB>
      <ns:Gendr>1</ns:Gendr>
      <ns:Pod>NCL</ns:Pod>
      <ns:AttID>503898066984</ns:AttID>
      <ns:HRG>WF01A</ns:HRG>
      <ns:AppDte>2018-05-11T14:29:00</ns:AppDte>
      <ns:Tfc>172</ns:Tfc>
      <ns:ConCode>C0000000</ns:ConCode>
      <ns:PathId xsi:nil="true" />
      <ns:PatOrgId xsi:nil="true" />
      <ns:CstActivity>
        <ns:ActCstID>OUT001</ns:ActCstID>
        <ns:ActCnt>1440</ns:ActCnt>
        <ns:Resource>
          <ns:ResCstID>CPF005</ns:ResCstID>
          <ns:TotCst>10.00000000</ns:TotCst>
        </ns:Resource>
      </ns:CstActivity>
    </ns:Activity>
</ns:MessageBody>
</ns:HCDSExtract>

我的 xsl 文件:

<xsl:stylesheet version="1.0" xmlns:ns="http://Improvement.nhs.uk/HealthcareCostingDataSet/v03-1819" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <dataroot>
            <xsl:apply-templates select="@*|node()"/>
        </dataroot>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ns:Activity">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>

    <xsl:template match="ns:CstActivity">
        <ns:CstActivity>
            <ns:AttID><xsl:value-of select="../ns:AttID"/></ns:AttID>
            <xsl:apply-templates select="@*|node()"/>
        </ns:CstActivity>
    </xsl:template>

</xsl:stylesheet>

我们将不胜感激任何帮助。提前谢谢你。

编辑:

我的新 xsl 如下:


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="http://Improvement.nhs.uk/HealthcareCostingDataSet/v03-1819">

      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>

<xsl:template match="ns:CstActivity"><xsl:apply-templates /></xsl:template>



<xsl:template match="ns:Resource"><xsl:apply-templates /></xsl:template>



    </xsl:stylesheet>

所以我最新的 xsl 给出的输出如下:

    <ns:Activity>
      <ns:OrgId>RRK</ns:OrgId>
      <ns:CDSID>503897890061</ns:CDSID>
      <ns:NHSNo>1111111111</ns:NHSNo>
      <ns:NhsSt>02</ns:NhsSt>
      <ns:Postcd>RD15 2AD</ns:Postcd>
      <ns:DoB>1967-04-01</ns:DoB>
      <ns:Gendr>1</ns:Gendr>
      <ns:Pod>NCL</ns:Pod>
      <ns:AttID>503897890061</ns:AttID>
      <ns:HRG>WF01A</ns:HRG>
      <ns:AppDte>2018-05-28T17:14:00</ns:AppDte>
      <ns:Tfc>306</ns:Tfc>
      <ns:ConCode>C0000000</ns:ConCode>
      <ns:PathId xsi:nil="true"/>
      <ns:PatOrgId xsi:nil="true"/>

        <ns:ActCstID>DIM007</ns:ActCstID>
        <ns:ActCnt>3</ns:ActCnt>

          <ns:ResCstID>CPF002</ns:ResCstID>
          <ns:TotCst>10.00000000</ns:TotCst>

这很好,但是对于该部分

        <ns:ActCstID>DIM007</ns:ActCstID>
        <ns:ActCnt>3</ns:ActCnt>

          <ns:ResCstID>CPF002</ns:ResCstID>
          <ns:TotCst>10.00000000</ns:TotCst>

父节点中的每个条目可能有许多这 4 位信息....我希望父节点中的每个相关记录针对每个不同的子节点重复。我希望这是有道理的。

这么多所需的输出 xml 将是:

   <ns:Activity>
      <ns:OrgId>RRK</ns:OrgId>
      <ns:CDSID>503897890061</ns:CDSID>
      <ns:NHSNo>1111111111</ns:NHSNo>
      <ns:NhsSt>02</ns:NhsSt>
      <ns:Postcd>RD15 2AD</ns:Postcd>
      <ns:DoB>1967-04-01</ns:DoB>
      <ns:Gendr>1</ns:Gendr>
      <ns:Pod>NCL</ns:Pod>
      <ns:AttID>503897890061</ns:AttID>
      <ns:HRG>WF01A</ns:HRG>
      <ns:AppDte>2018-05-28T17:14:00</ns:AppDte>
      <ns:Tfc>306</ns:Tfc>
      <ns:ConCode>C0000000</ns:ConCode>
      <ns:PathId xsi:nil="true"/>
      <ns:PatOrgId xsi:nil="true"/>
      <ns:ActCstID>DIM007</ns:ActCstID>
      <ns:ActCnt>3</ns:ActCnt>
      <ns:ResCstID>CPF002</ns:ResCstID>
      <ns:TotCst>10.00000000</ns:TotCst>
 </ns:Activity>
<ns:Activity>
 <ns:OrgId>RRK</ns:OrgId>
      <ns:CDSID>503897890061</ns:CDSID>
      <ns:NHSNo>1111111111</ns:NHSNo>
      <ns:NhsSt>02</ns:NhsSt>
      <ns:Postcd>RD15 2AD</ns:Postcd>
      <ns:DoB>1967-04-01</ns:DoB>
      <ns:Gendr>1</ns:Gendr>
      <ns:Pod>NCL</ns:Pod>
      <ns:AttID>503897890061</ns:AttID>
      <ns:HRG>WF01A</ns:HRG>
      <ns:AppDte>2018-05-28T17:14:00</ns:AppDte>
      <ns:Tfc>306</ns:Tfc>
      <ns:ConCode>C0000000</ns:ConCode>
      <ns:PathId xsi:nil="true"/>
      <ns:PatOrgId xsi:nil="true"/>
      <ns:ActCstID>MID127</ns:ActCstID>
      <ns:ActCnt>2</ns:ActCnt>
      <ns:ResCstID>CPD060</ns:ResCstID>
      <ns:TotCst>12.05000000</ns:TotCst>
</ns:Activity>

非常感谢任何帮助!

希望输出的大纲的最新编辑。很抱歉,我可能没有给出一个很好的示例输入 xml 来解决问题,但希望输入/输出 xml 更清楚地解释了我正在寻找的内容。

输入xml:

 <ns:Activity>
      <ns:OrgId>RRK</ns:OrgId>
      <ns:CDSID>503897986301</ns:CDSID>
      <ns:NHSNo>1111111111</ns:NHSNo>
      <ns:NhsSt>01</ns:NhsSt>
      <ns:Postcd>RD15 2AD</ns:Postcd>
      <ns:DoB>1967-04-01</ns:DoB>
      <ns:Gendr>1</ns:Gendr>
      <ns:Pod>NCL</ns:Pod>
      <ns:AttID>503897986301</ns:AttID>
      <ns:HRG>WF01B</ns:HRG>
      <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
      <ns:Tfc>191</ns:Tfc>
      <ns:ConCode>C0000000</ns:ConCode>
      <ns:PathId xsi:nil="true" />
      <ns:PatOrgId xsi:nil="true" />
      <ns:CstActivity>
        <ns:ActCstID>OUT001</ns:ActCstID>
        <ns:ActCnt>1</ns:ActCnt>
        <ns:Resource>
          <ns:ResCstID>CPF002</ns:ResCstID>
          <ns:TotCst>0.01711470</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF004</ns:ResCstID>
          <ns:TotCst>0.00005506</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF011</ns:ResCstID>
          <ns:TotCst>0.12799014</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF022</ns:ResCstID>
          <ns:TotCst>0.00622135</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF023</ns:ResCstID>
          <ns:TotCst>6.55181258</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF024</ns:ResCstID>
          <ns:TotCst>0.08211900</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF027</ns:ResCstID>
          <ns:TotCst>0.04333875</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CSC004</ns:ResCstID>
          <ns:TotCst>18.95493831</ns:TotCst>
        </ns:Resource>
      </ns:CstActivity>
      <ns:CstActivity>
        <ns:ActCstID>SUP001</ns:ActCstID>
        <ns:ActCnt>1</ns:ActCnt>
        <ns:Resource>
          <ns:ResCstID>CPF002</ns:ResCstID>
          <ns:TotCst>0.00000124</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF011</ns:ResCstID>
          <ns:TotCst>0.00000148</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF022</ns:ResCstID>
          <ns:TotCst>0.00002230</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF023</ns:ResCstID>
          <ns:TotCst>-0.00000221</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CPF024</ns:ResCstID>
          <ns:TotCst>0.00017128</ns:TotCst>
        </ns:Resource>
        <ns:Resource>
          <ns:ResCstID>CSC004</ns:ResCstID>
          <ns:TotCst>0.16603542</ns:TotCst>

希望输出xml:

<ns:Activity>
      <ns:OrgId>RRK</ns:OrgId>
      <ns:CDSID>503897986301</ns:CDSID>
      <ns:NHSNo>1111111111</ns:NHSNo>
      <ns:NhsSt>01</ns:NhsSt>
      <ns:Postcd>RD15 2AD</ns:Postcd>
      <ns:DoB>1967-04-01</ns:DoB>
      <ns:Gendr>1</ns:Gendr>
      <ns:Pod>NCL</ns:Pod>
      <ns:AttID>503897986301</ns:AttID>
      <ns:HRG>WF01B</ns:HRG>
      <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
      <ns:Tfc>191</ns:Tfc>
      <ns:ConCode>C0000000</ns:ConCode>
      <ns:PathId xsi:nil="true"/>
      <ns:PatOrgId xsi:nil="true"/>
      <ns:ActCstID>OUT001</ns:ActCstID>
      <ns:ActCnt>1</ns:ActCnt>
      <ns:ResCstID>CPF002</ns:ResCstID>
      <ns:TotCst>0.01711470</ns:TotCst>
</ns:Activity>
<ns:Activity>
      <ns:OrgId>RRK</ns:OrgId>
      <ns:CDSID>503897986301</ns:CDSID>
      <ns:NHSNo>1111111111</ns:NHSNo>
      <ns:NhsSt>01</ns:NhsSt>
      <ns:Postcd>RD15 2AD</ns:Postcd>
      <ns:DoB>1967-04-01</ns:DoB>
      <ns:Gendr>1</ns:Gendr>
      <ns:Pod>NCL</ns:Pod>
      <ns:AttID>503897986301</ns:AttID>
      <ns:HRG>WF01B</ns:HRG>
      <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
      <ns:Tfc>191</ns:Tfc>
      <ns:ConCode>C0000000</ns:ConCode>
      <ns:PathId xsi:nil="true"/>
      <ns:PatOrgId xsi:nil="true"/>
      <ns:ActCstID>THR001</ns:ActCstID>
      <ns:ActCnt>2</ns:ActCnt>
      <ns:ResCstID>CPF004</ns:ResCstID>
      <ns:TotCst>0.00005506</ns:TotCst>
</ns:Activity>        
    <ns:Activity>
      <ns:OrgId>RRK</ns:OrgId>
      <ns:CDSID>503897986301</ns:CDSID>
      <ns:NHSNo>1111111111</ns:NHSNo>
      <ns:NhsSt>01</ns:NhsSt>
      <ns:Postcd>RD15 2AD</ns:Postcd>
      <ns:DoB>1967-04-01</ns:DoB>
      <ns:Gendr>1</ns:Gendr>
      <ns:Pod>NCL</ns:Pod>
      <ns:AttID>503897986301</ns:AttID>
      <ns:HRG>WF01B</ns:HRG>
      <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
      <ns:Tfc>191</ns:Tfc>
      <ns:ConCode>C0000000</ns:ConCode>
      <ns:PathId xsi:nil="true"/>
      <ns:PatOrgId xsi:nil="true"/>
      <ns:ActCstID>SUP001</ns:ActCstID>
      <ns:ActCnt>1</ns:ActCnt>
      <ns:ResCstID>CPF002</ns:ResCstID>
      <ns:TotCst>0.00000124</ns:TotCst>
</ns:Activity>

因此,基本上,对于以下字段的每个变体,都会引入旧的父节点,因此每个 CDSID 都有很多行,而不仅仅是一个。

  <ns:ActCstID>SUP001</ns:ActCstID>
  <ns:ActCnt>1</ns:ActCnt>
  <ns:ResCstID>CPF002</ns:ResCstID>
  <ns:TotCst>0.00000124</ns:TotCst>

再次感谢您的帮助。

【问题讨论】:

  • 首先,匹配文档根是多余的,除非你想追加一个新的元素根。但是,¿为什么要在空的命名空间中输出一些元素?其次,您复制所有内容,绕过 Activity 而不是其子元素,最后复制 CstActivity 和元素子元素(不是属性)但复制其父元素 AttID 元素。您最好发布预期的输出
  • 感谢您的回复亚历杭德罗。
  • 感谢您的回复亚历杭德罗。老实说,相当一部分是从我可能不明白的其他各种代码 sn-ps 复制和粘贴的。我现在进步了一点,我在上面添加了我的新 xsl 代码。我使用了一些将第一个子节点元素复制到父节点的代码。然而现在的问题是,对于每个有多个子节点的父节点,它在第一个节点之后忽略它们!我实际上正在寻找的是每次在每行添加唯一相关子节点时重复父节点的行。谢谢。
  • 嗯,现在更清楚您想要扁平化层次结构。

标签: xml xslt xslt-1.0 xslt-2.0


【解决方案1】:

考虑这个修改后的 XSLT,它沿着树(与身份转换相反)只解析 ns:Activity 节点及其子节点和孙子节点。此外,脚本避免了重写它们的节点,因为在 MS Access 的ImportXML 中,每个不同的嵌套元素都变成了自己的表。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:ns="http://Improvement.nhs.uk/HealthcareCostingDataSet/v03-1819" 
                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/ns:HCDSExtract">
        <dataroot>
            <xsl:apply-templates select="ns:MessageBody"/>
        </dataroot>
    </xsl:template>

    <xsl:template match="ns:MessageBody">
        <xsl:apply-templates select="ns:Activity"/>
    </xsl:template>

    <xsl:template match="ns:Activity">
        <xsl:copy>
            <xsl:copy-of select="*[not(*)]"/>
            <xsl:copy-of select="*/*[not(*)]"/>
            <xsl:copy-of select="*/*/*"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XSLT demo

【讨论】:

  • 如果您进行推送式转换,最好将ns:Activity 模板简化为&lt;xsl:copy-of select="*[not(self::ns:CstActivity)] |ns:CstActivity/*[not(self::ns:Resource)] |ns:CstActivity/ns:Resource/*"/&gt;。但请注意,OP 说 “父节点中的每个条目可能有很多这 4 位信息”
  • 很好,聪明的重构,但可以说这不是太可读,特别是对于 XSLT 新手!我现在已经编辑了解决方案和演示以获得更通用的版本。
  • 非常感谢 Parfait 和 Alejandro。你的解释是最优秀和最有用的,我确实觉得我正在学习。但是,我很难理解如何更改代码以允许其随附的每个唯一子节点组合都有一个新的重复父节点。我已经编辑了我的原始帖子并编写了一个我想要得到的 xml 输出,我希望你能解释我们如何使转换产生所有重复的父节点和每个唯一的子节点。再次感谢您的帮助。
【解决方案2】:

这里有一个扁平化一些层次结构的示例,例如:

<countries>
    <country>
        <name>USA</name>
        <state>Alabama</state>
        <state>Colorado</state>
    </country>
</countries>

这个样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="countries">
        <states>
            <xsl:apply-templates select="country/state" mode="uprise"/>
        </states>
    </xsl:template>

    <xsl:template match="state"/>

    <xsl:template match="state" mode="uprise">
        <xsl:copy>
            <name>
                <xsl:value-of select="."/>
            </name>
            <xsl:apply-templates select=".."/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="country/name">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

输出:

<states>
   <state>
      <name>Alabama</name>
      <country>USA</country>
   </state>
   <state>
      <name>Colorado</name>
      <country>USA</country>
   </state>
</states>

请注意:为了展平,您可以定位叶子,然后生成向上层级的输出。在这种情况下,我使用了压倒一切的 indentity 模板模式,因此有一种模式可以处理叶子,另一种模式(默认)可以停止进程,以免产生无限循环。

编辑:因为您似乎在遵循此逻辑时遇到了麻烦,所以我将向您展示一个样式表,其名称已更改以匹配您的输入示例(也已更正为格式正确强>)。

这个输入:

<ns:HCDSExtract xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:ns="http://Improvement.nhs.uk/HealthcareCostingDataSet/v03-1819">
   <ns:MessageHeader>
      <ns:OrgSubmittingID>RRK</ns:OrgSubmittingID>
      <ns:FinYr>FY2018-19</ns:FinYr>
      <ns:PeriodStartDate>2018-05-01</ns:PeriodStartDate>
      <ns:PeriodEndDate>2018-05-31</ns:PeriodEndDate>
      <ns:CreateDateTime>2018-03-28T18:25:04</ns:CreateDateTime>
      <ns:FeedType>OP</ns:FeedType>
      <ns:NoOfActivityRecords>10</ns:NoOfActivityRecords>
      <ns:TotalCosts>100.000</ns:TotalCosts>
   </ns:MessageHeader>
   <ns:MessageBody>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:CstActivity>
            <ns:ActCstID>OUT001</ns:ActCstID>
            <ns:ActCnt>1</ns:ActCnt>
            <ns:Resource>
               <ns:ResCstID>CPF002</ns:ResCstID>
               <ns:TotCst>0.01711470</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF004</ns:ResCstID>
               <ns:TotCst>0.00005506</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF011</ns:ResCstID>
               <ns:TotCst>0.12799014</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF022</ns:ResCstID>
               <ns:TotCst>0.00622135</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF023</ns:ResCstID>
               <ns:TotCst>6.55181258</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF024</ns:ResCstID>
               <ns:TotCst>0.08211900</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF027</ns:ResCstID>
               <ns:TotCst>0.04333875</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CSC004</ns:ResCstID>
               <ns:TotCst>18.95493831</ns:TotCst>
            </ns:Resource>
         </ns:CstActivity>
         <ns:CstActivity>
            <ns:ActCstID>SUP001</ns:ActCstID>
            <ns:ActCnt>1</ns:ActCnt>
            <ns:Resource>
               <ns:ResCstID>CPF002</ns:ResCstID>
               <ns:TotCst>0.00000124</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF011</ns:ResCstID>
               <ns:TotCst>0.00000148</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF022</ns:ResCstID>
               <ns:TotCst>0.00002230</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF023</ns:ResCstID>
               <ns:TotCst>-0.00000221</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CPF024</ns:ResCstID>
               <ns:TotCst>0.00017128</ns:TotCst>
            </ns:Resource>
            <ns:Resource>
               <ns:ResCstID>CSC004</ns:ResCstID>
               <ns:TotCst>0.16603542</ns:TotCst>
            </ns:Resource>
         </ns:CstActivity>
      </ns:Activity>
   </ns:MessageBody>
</ns:HCDSExtract>

使用此样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
        xmlns:ns="http://Improvement.nhs.uk/HealthcareCostingDataSet/v03-1819">
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>

        <xsl:template match="ns:MessageBody">
            <xsl:copy>
                <xsl:apply-templates
                     select="ns:Activity/ns:CstActivity/ns:Resource" mode="uprise"/>
            </xsl:copy>
        </xsl:template>

        <xsl:template match="ns:Resource|ns:CstActivity|ns:MessageHeader"/>

        <xsl:template match="ns:Resource" mode="uprise">
            <ns:Activity>
                <xsl:apply-templates select="../../*|../*"/>
                <xsl:apply-templates/>            
            </ns:Activity>
        </xsl:template>
    </xsl:stylesheet>

输出:

<ns:HCDSExtract xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:ns="http://Improvement.nhs.uk/HealthcareCostingDataSet/v03-1819">
   <ns:MessageBody>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>OUT001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF002</ns:ResCstID>
         <ns:TotCst>0.01711470</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>OUT001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF004</ns:ResCstID>
         <ns:TotCst>0.00005506</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>OUT001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF011</ns:ResCstID>
         <ns:TotCst>0.12799014</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>OUT001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF022</ns:ResCstID>
         <ns:TotCst>0.00622135</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>OUT001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF023</ns:ResCstID>
         <ns:TotCst>6.55181258</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>OUT001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF024</ns:ResCstID>
         <ns:TotCst>0.08211900</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>OUT001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF027</ns:ResCstID>
         <ns:TotCst>0.04333875</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>OUT001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CSC004</ns:ResCstID>
         <ns:TotCst>18.95493831</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>SUP001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF002</ns:ResCstID>
         <ns:TotCst>0.00000124</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>SUP001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF011</ns:ResCstID>
         <ns:TotCst>0.00000148</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>SUP001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF022</ns:ResCstID>
         <ns:TotCst>0.00002230</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>SUP001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF023</ns:ResCstID>
         <ns:TotCst>-0.00000221</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>SUP001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CPF024</ns:ResCstID>
         <ns:TotCst>0.00017128</ns:TotCst>
      </ns:Activity>
      <ns:Activity>
         <ns:OrgId>RRK</ns:OrgId>
         <ns:CDSID>503897986301</ns:CDSID>
         <ns:NHSNo>1111111111</ns:NHSNo>
         <ns:NhsSt>01</ns:NhsSt>
         <ns:Postcd>RD15 2AD</ns:Postcd>
         <ns:DoB>1967-04-01</ns:DoB>
         <ns:Gendr>1</ns:Gendr>
         <ns:Pod>NCL</ns:Pod>
         <ns:AttID>503897986301</ns:AttID>
         <ns:HRG>WF01B</ns:HRG>
         <ns:AppDte>2018-05-02T10:19:00</ns:AppDte>
         <ns:Tfc>191</ns:Tfc>
         <ns:ConCode>C0000000</ns:ConCode>
         <ns:PathId xsi:nil="true"/>
         <ns:PatOrgId xsi:nil="true"/>
         <ns:ActCstID>SUP001</ns:ActCstID>
         <ns:ActCnt>1</ns:ActCnt>
         <ns:ResCstID>CSC004</ns:ResCstID>
         <ns:TotCst>0.16603542</ns:TotCst>
      </ns:Activity>
   </ns:MessageBody>
</ns:HCDSExtract>

查看here

【讨论】:

  • 亚历杭德罗,这很完美,给了我我想要的东西。太谢谢你了,我欠你的。 XSL 只是让我感到困惑,当我需要它时,我发现学习 html/php/css 非常容易。当然,总会有一个问题接踵而至……只是想知道您是否知道转换 xml 和存储它的更好方法?超过 20mb 的任何输入 xml 的访问错误。我有将近 1.5gb 的 xml 文件要转换。我的理解是,有可能使用 ImportXML vba 函数导入并流式传输转换或
  • 在导入 SQL 数据库的同时转换 xml。关于采取适当方法的任何想法?非常感谢。
  • 很高兴它对您有所帮助。看来您还有其他好问题应该单独发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
相关资源
最近更新 更多