【发布时间】: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