首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较不同XML文件中的元素值,并将其追加到第一个XML

比较不同XML文件中的元素值,并将其追加到第一个XML
EN

Stack Overflow用户
提问于 2013-11-15 22:37:56
回答 1查看 434关注 0票数 3

我有以下2个xml文件,通过比较wd:Task_Name_ID的元素值和XMLFile-2的TaskID,生成与主XMLFil-1完全相同的XML。

例如,主XMLFile-1 wd:Task_Name_ID的值为任务-1、任务-2、任务-3、任务-4、任务-5

和XML文件-2 TaskID任务-2,Task-6,Task-7,Task-1

使用XSLT,我需要生成的文件应该与主XML文件-1以及Task-6、Task-7完全相同。

主XML - File-1

代码语言:javascript
复制
<?xml version='1.0' encoding='UTF-8'?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <wd:Get_Phase_Response xmlns:wd="urn:com" >
      <wd:Response_Data>
        <wd:Project>
          <wd:Project_Data>
            <wd:Project_ID>W-PROJECT-1</wd:Project_ID>
            <wd:Project_Name>W-PROJECT-1 Description</wd:Project_Name>
            <wd:Phase_Data>
              <wd:Task_Data>
                <wd:Task_Name_Data>
                  <wd:Task_Name_ID>Task-1</wd:Task_Name_ID>
                  <wd:Name>W-PHASE Task-1</wd:Name>
                </wd:Task_Name_Data>
              </wd:Task_Data>
              <wd:Task_Data>
                <wd:Task_Name_Data>
                  <wd:Task_Name_ID>Task-2</wd:Task_Name_ID>
                  <wd:Name>W-PHASE Task-2</wd:Name>
                </wd:Task_Name_Data>
              </wd:Task_Data>
              <wd:Task_Data>
                <wd:Task_Name_Data>
                  <wd:Task_Name_ID>Task-3</wd:Task_Name_ID>
                  <wd:Name>W-PHASE Task-3</wd:Name>
                </wd:Task_Name_Data>
              </wd:Task_Data>
              <wd:Task_Data>
                <wd:Task_Name_Data>
                  <wd:Task_Name_ID>Task-4</wd:Task_Name_ID>
                  <wd:Name>W-PHASE Task-4</wd:Name>
                </wd:Task_Name_Data>
              </wd:Task_Data>
              <wd:Task_Data>
                <wd:Task_Name_Data>
                  <wd:Task_Name_ID>Task-5</wd:Task_Name_ID>
                  <wd:Name>W-PHASE Task-5</wd:Name>
                </wd:Task_Name_Data>
              </wd:Task_Data>
            </wd:Phase_Data>
          </wd:Project_Data>
        </wd:Project>
      </wd:Response_Data>
    </wd:Get_Phase_Response>
  </env:Body>
</env:Envelope>

XML文件-2

代码语言:javascript
复制
<Report>
      <Details>
        <Project>W-PROJECT-1</Project>
        <TaskID>Task-2</TASKID>
        <Descr>W-PHASE Task-2</Descr>
      </Details>
      <Details>
        <Project>W-PROJECT-1</Project>
        <TaskID>Task-6</TASKID>
        <Descr>W-PHASE Task-6</Descr>
      </Details>
      <Details>
        <Project>W-PROJECT-1</Project>
        <TaskID>Task-7</TASKID>
        <Descr>W-PHASE Task-7</Descr>
      </Details>
      <Details>
        <Project>W-PROJECT-1</Project>
        <TaskID>Task-1</TASKID>
        <Descr>W-PHASE Task-1</Descr>
      </Details>
    </Report>
EN

回答 1

Stack Overflow用户

发布于 2013-11-27 15:41:03

对不起,如果格式不太好,这是我第一次回答一个问题。如果您正在使用XSL2.0,请尝试以下方法,使用File-1作为输入。您也可以将此示例扩展为按Project_Data按Project_ID分组,但由于没有指定多个Project_Data对象,所以我没有包括它。

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wd="urn:com" exclude-result-prefixes="xs" version="2.0">
        <xsl:output method="xml" omit-xml-declaration="yes"/>
        <xsl:variable name="details" select="doc('File-2.xml')"/>
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
        <xsl:template match="wd:Phase_Data">
            <xsl:copy>
                <xsl:for-each-group select="wd:Task_Data|$details/Report/Details" group-by="if(TaskID) then TaskID else wd:Task_Name_Data/wd:Task_Name_ID">
                    <xsl:element name="wd:Task_Data">
                        <xsl:element name="wd:Task_Name_Data">
                            <xsl:element name="wd:Task_Name_ID">
                                <xsl:value-of select="current-grouping-key()"/>
                            </xsl:element>
                            <xsl:element name="wd:Name">
                                <xsl:value-of select="if(Descr) then Descr else wd:Task_Name_Data/wd:Name"/>
                            </xsl:element>
                        </xsl:element>
                    </xsl:element>
                </xsl:for-each-group>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20011843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档