2012-09-10 82 views
2

我有兩個xml文件。我想合併它們並用幾個屬性進行一些算術運算。請提供一些想法。我正在使用標準的xslt http://informatik.hu-berlin.de/merge來合併文件。合併2個XML文件並修改屬性值

文件1:

<coverage branch-rate="0.5125" branch-total="50" line-rate="0.00593031875463"> 
</coverage> 

文件2:

<coverage branch-rate="0.5" branch-total="40" line-rate="1.0"> 
</coverage> 

預期成果文件

<coverage branch-rate="(0.5125*50 + 05*40)/(50+40)" branch-total="50" line-rate="0.00593031875463"> 
</coverage> 

回答

1

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pFile1" select="'file:///c:/temp/delete/file1.xml'"/> 
<xsl:param name="pFile2" select="'file:///c:/temp/delete/file2.xml'"/> 

<xsl:variable name="vF2Cover" select="document($pFile2)/coverage"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="document($pFile1)/coverage"/> 
</xsl:template> 

<xsl:template match="coverage"> 
    <coverage branch-rate= 
    "{(@branch-rate*@branch-total + $vF2Cover/@branch-rate*$vF2Cover/@branch-total) 
     div (@branch-total+$vF2Cover/@branch-total) 
    }" 
    branch-total= 
    "{@branch-total*(@branch-total>= $vF2Cover/@branch-total) 
    + 
    $vF2Cover/@branch-total*($vF2Cover/@branch-total >@branch-total) 
    }" 
    line-rate= 
    "{@line-rate*($vF2Cover/@line-rate >= @line-rate) 
    + 
    $vF2Cover/@line-rate*(@line-rate > $vF2Cover/@line-rate) 
    }"/> 
</xsl:template> 
</xsl:stylesheet> 

當在任何XML文檔(未使用)施加,並且具有提供的兩個XML文檔駐留在:

C:/溫度/刪除/file1.xml:

<coverage branch-rate="0.5125" branch-total="50" line-rate="0.00593031875463"> 
</coverage> 

和c:/ temp/delete/f ile2.xml:

<coverage branch-rate="0.5" branch-total="40" line-rate="1.0"> 
</coverage> 

產生想要的,正確的結果:

<coverage branch-rate="0.5069444444444444" branch-total="50" line-rate="0.00593031875463" /> 
+0

你忘了線速屬性。 –

+0

@ SeanB.Durkin,沒有解釋如何獲得它的價值。 –

+0

是的。猜測,我會說最低限度,就像分支總數最大一樣。但這只是一個猜測。 –

1

您可以使用XSLT和文檔功能。文檔將另一個xml文件加載到xslt處理中。這個例子只做一個簡單的算術運算。你需要修改它。

<xsl:template match="coverage"> 
    <xsl:variable name="branchRateFromFile1" select="@branch-rate"/> 
    <xsl:variable name="branchRateFromFile2" select="document(FILE2)/coverage/@branch-rate"/> 
    <xsl:copy> 
     <xsl:attribute name="branch-rate"><xsl:value-of select="number($branchRateFromFile1)+number($branchRateFromFile2)"/></xsl:attribute> 
     <xsl:apply-templates select="*"/> 
    </xsl:copy> 
</xsl:template>