【问题标题】:XSLT - Merge two files with same node valueXSLT - 合并具有相同节点值的两个文件
【发布时间】:2021-07-09 06:26:34
【问题描述】:

我有两个要合并的具有相同值的 xml 文件。我想根据 SystemId 和 Title 的值将第二个文件的内容合并到第一个文件中。

第一个文件:

<Package>
      <Descriptive>
         <Unit id="Id_1502037">
            <Content>
               <Description>Description 1</Description>
               <SystemId>1502037</SystemId>
            </Content>
            <Unit id="Id_Comp_1502037">
               <Content>
                  <Description>Description 1.1</Description>
               </Content>
            </Unit>
         </Unit>
         <Unit id="Id_1502043">
            <Content>
               <Description>Description 2</Description><SystemId>1502043</SystemId>
            </Content>
            <Unit id="Id_Comp_1502043">
               <Content>
                  <Description>Description 2.1</Description>
               </Content>
            </Unit>
         </Unit>
      </Descriptive>
   </Package>

第二个文件:

<Package>
    <Descriptive>
      <Unit id="ID10">
        <Content>
          <Description>Description 1.2</Description>
          <Title>1502037</Title>
        </Content>
      </Unit>
      <Unit id="ID20">
        <Content>
          <Description>Description 2.2</Description>
          <Title>1502043</Title>
        </Content>
      </Unit>
    </Descriptive>
  </Package>

想要的结果:

<Package>
      <Descriptive>
         <Content>
            <Description>Description 1</Description>
            <SystemId>1502037</SystemId>
         </Content>
         <Unit id="Id_Comp_1502037">
            <Content>
               <Description>Description 1.1</Description>
            </Content>
         </Unit>
         <Unit id="ID10">
            <Content>
               <Description>Description 1.2</Description>
               <Title>1502037</Title>
            </Content>
         </Unit>
         <Content>
            <Description>Description 2</Description>
            <SystemId>1502043</SystemId>
         </Content>
         <Unit id="Id_Comp_1502043">
            <Content>
               <Description>Description 2.1</Description>
            </Content>
         </Unit>
         <Unit id="ID20">
            <Content>
               <Description>Description 2.2</Description>
               <Title>1502043</Title>
            </Content>
         </Unit>
      </Descriptive>
   </Package>

我编写了以下 XSLT ($ressource = file2.xml):

<xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    
    
    <xsl:template match="Descriptive">
        <xsl:element name="Descriptive">
            <xsl:for-each select="Unit">
                <xsl:variable name="ids" select="Content/SystemId"/>
                <xsl:copy-of select="*"/>
                <xsl:for-each select="$ressource/Package/Descriptive/Unit/Content/Title[. = $ids]">
                    <xsl:copy-of select="$ressource/Package/Descriptive/Unit"/>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>

几乎是对的,但结果重复了第二个文件的所有节点。有任何想法吗?谢谢!

【问题讨论】:

  • 请始终说明您使用的是哪个 XSLT 版本 - 它通常会影响答案。

标签: loops xslt merge


【解决方案1】:
<xsl:for-each select="$ressource/Package/Descriptive/Unit/Content/Title[. = $ids]">
    <xsl:copy-of select="$ressource/Package/Descriptive/Unit"/>
</xsl:for-each>

这就是说“对于每个单元,复制所有单元”。您只想复制所有符合条件的单位,即

<xsl:copy-of select="$ressource/Package/Descriptive/Unit[Content/Title=$ids]"/>

(未测试 - 可能还有其他错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多