比较来自不同XML文件的元素值并附加到第一个XML

时间:2013-11-15 22:37:57

标签: xml xslt xpath

我有以下2个xml文件,我必须通过将 wd:Task_Name_ID 的元素值与 TaskID <进行比较来生成与我的主XML文件-1完全相同的XML / strong> of XML File-2。

例如,

主XML文件-1 wd:Task_Name_ID 具有以下值任务-1,任务-2,任务-3,任务-4,任务-5

XML文件-2 任务ID 任务-2,任务-6,任务7,任务1

使用 XSLT ,我需要生成与 Main XML File-1 完全相同的文件以及 Task-6,Task-7

主要XML - 文件-1

<?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

<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>

1 个答案:

答案 0 :(得分:0)

很抱歉,如果格式不佳,这是我第一次回答问题。如果您使用的是XSL 2.0,请尝试使用File-1作为输入的以下方法。您可以展开此示例以按Project_ID对Project_Data进行分组,但由于您未指定多个Project_Data对象,因此我未将其包括在内。

    <?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>