【问题标题】:Merge two XMLs with common fields and adding fields from both xmls using XSLT使用 XSLT 合并两个具有公共字段的 XML 并从两个 xml 添加字段
【发布时间】:2019-04-25 15:29:52
【问题描述】:

我有两个 xmls

  1. a.xml
  2. b.xml

下面是a.xml文件

<proj_details>
    <proj_detail>
        <Username>Username</Username>
        <ID>ID</ID>
        <Place>Ocean</Place>
        <City>Urban</City>
        <!-- some more fields -->
    </proj_detail>
    <proj_detail>
        <Username>abc@abc.com</Username>
        <ID>QoChiX5FlqU7VB2MKw5Aa</ID>
        <Place>Road</Place>
        <City>Rural</City>
        <!-- some more fields -->
    </proj_detail>
    <proj_detail>
        <Username>abc@abc.com</Username>
        <ID>uzGjRVxnZPtB9sfiXtga</ID>
        <Place>Mud</Place>
        <City>SemiRural</City>
        <!-- some more fields -->
    </proj_detail>
    <proj_detail>
        <Username>abc@abc.com</Username>
        <ID>YChiX5FluqhuyVB2OPw5Aa</ID>
        <Place>Sea</Place>
        <City>Sealine</City>
        <!-- some more fields -->
    </proj_detail>
    <proj_detail>
        <Username>abc@abc.com</Username>
        <ID>RD37oO2jgW5p6f76W8up</ID>
        <Place>Lane</Place>
        <City>Leftsidelane</City>
        <!-- some more fields -->
    </proj_detail>
    </proj_details>

    <!-- more fields    -->

下面是b.xml

    <FilebDetail>
        <Number>34</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>xyz@xyz.com</PROD>
        <ID>QoChiX5FlqU7VB2MKw5Aa</ID>
        <Name>Directory/notepad</Name>
        <Count>43</Count>
        <time>43550.53333336</time>
        <!-- some more fields-->
    </FilebDetail>
    <FilebDetail>
        <Number>35</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>cvb@cvb.com</PROD>
        <ID>uzGjRVxnZPtB9sfiXtga</ID>
        <Name>Speed/morning</Name>
        <Count>42</Count>
        <time>43550.5778</time>
        <!-- some more fields-->
    </FilebDetail>
    <FilebDetail>
        <Number>31</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>cvb@cvb.com</PROD>
        <ID>RD37oO2jgW5p6f76W8up</ID>
        <Name>Weatherincity</Name>
        <Count>12</Count>
        <time>43550.498611111114</time>
        <!-- some more fields-->
    </FilebDetail>

    </FilebDetails>

现在,我想得到如下所示的输出

        <proj_detail>
        <Number>34</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>xyz@xyz.com</PROD>
        <ID>QoChiX5FlNyqe1FuqU7VB2M</ID>
        <Name>Directory/notepad</Name>
        <Count>12</Count>
        <time>43550.498611111114</time>
        <Place>Road</Place>
        <City>Rural</City>
         <!-- some more fields -->
        </proj_detail>

        <proj_detail>
        <Number>35</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>cvb@cvb.com</PROD>
        <ID>uzGjRVxnxmP00zrnZPtB9sM</ID>
        <Name>Speed/morning</Name>
        <Count>42</Count>
        <time>43550.5778</time>
        <Place>Mud</Place>
        <City>SemiRural</City>
        </proj_detail>
         <!-- some more fields -->
        <proj_detail>
        <Number>31</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>cvb@cvb.com</PROD>
        <ID>RD37oO2jg4rlerxW5p6f76</ID>
        <Name>Weatherincity</Name>
        <Count>12</Count>
        <time>43550.498611111114</time>
        <Place>Lane</Place>
        <City>Leftsidelane</City>
        </proj_detail>
        <!-- some more fields -->
        </proj_details>

在这两个文件中,ID 是通用的,这就是需要比较的内容。比较后,我们将打印两个文件中的相应字段。

我是 xslt 的新手。任何 xslt 版本都可以使用。

这方面的任何指导都会很有帮助。

谢谢

【问题讨论】:

    标签: xslt xslt-1.0 xslt-2.0 xslt-grouping


    【解决方案1】:

    如果您有一对一的关系,则合并将很简单。以a.xml 作为输入,b.xml 作为参数运行这个 XSLT 2.0 样式表:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:param name="update"/>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="proj_detail">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
                <xsl:apply-templates 
                  select="$update/FilebDetails/FilebDetail[ID = current()/ID]/(* except ID)"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    

    请注意:您必须小心 XSLT 处理器将节点作为参数传递的机制,否则您将需要使用 document() 函数。

    从这个基本转换中,您可以添加优化,例如使用 key() 函数(您必须使用 XSLT 2.0 -arity 3- key() 函数)。您还可以通过 ID 和“字段”名称声明该键,假设 $update 参数是一个更新流,因此您将选择最后一个,等等。

    【讨论】:

    • @2437850 为什么会这样想?
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2019-08-25
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多