使用 XSLT 合并两个具有公共字段的 XML,并从两个 xml 添加字段



我有两个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 2.0 样式表,a.xml作为输入,b.xml作为参数:

<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参数是更新流,因此您将选择最后一个参数,等等。

相关内容

  • 没有找到相关文章

最新更新