我有以下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>
答案 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>