2015-11-04 65 views
0

XSLT新手 - 我試圖使用XSL轉換來比較和合並來自兩個不同位置的XML數據。使用XSL轉換來比較兩個節點,然後刪除一個

數據目前看起來是這樣的:

<root> 
    <table1> 
    <product>12345</product> 
    <dateCreated>2015-06-04</dateCreated> 
    <dateCompleted></dateCompleted> 
    </table1> 
    <table2> 
    <dateCreated>2015-08-28T06:34:00</dateCreated> 
    <dateCompleted></dateCompleted> 
    </table2> 
</root> 

,這是它需要如何:

<root> 
    <newtable> 
    <product>12345</product> 
    <dateCreated>2015-08-28T06:34:00</dateCreated> 
    <dateCompleted></dateCompleted> 
    </newtable> 
</root> 

從本質上講,我需要檢查/表2/dateCreated會存在,並且有一個值,如果是,則將該節點放入最終的XML中。

XSL文件看起來是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="table1/dateCreated | table2/dateCreated"> 
    <xsl:if test="table2/dateCreated !=''"> 
     <xsl:copy> 
     <xsl:apply-templates select="table2/dateCreated"/> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

很明顯,我在虧損爲所發生的事情 - 任何幫助表示讚賞!謝謝!

回答

1

如何:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="root"> 
    <xsl:copy> 
     <xsl:apply-templates select="table1"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="table1"> 
    <newtable> 
     <xsl:apply-templates/> 
    </newtable> 
</xsl:template> 

<xsl:template match="dateCreated"> 
    <xsl:variable name="alt" select="/root/table2/dateCreated" /> 
    <xsl:copy> 
     <xsl:choose> 
      <xsl:when test="string($alt)"> 
       <xsl:value-of select="$alt"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="."/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

我已經做了一些XSLT了,但你會介意解釋爲什麼這種轉變不添加第二個'dateCreated'到Table? – Stacky

+0

@Stacky我不知道我理解你的問題。最初的'table1'只有一個'dateCreated'。上面的樣式表複製它的標籤並在其中放入一個值。該值是來自'table2'的新值 - 如果存在 - 或現有值。 –

+0

@Stacky:我想你是來自程序/ OOP編程背景,並且正在考慮。 XSLT轉換不是在現場完成的(也就是說,您的數據與您操作的數組一樣)。相反,XSLT是功能性的(在具有不可變數據對象的功能範例中考慮,每個操作都創建一個新的數據對象)。所以在這種情況下,您有三個數據「對象」:兩個輸入(table1和table2)和一個輸出(result = table3)。上面的代碼選擇table1或table2並將其複製到table3,因此輸入「對象」之一被設計丟棄。 – zx485