2017-03-01 64 views
0

我有一個樣本Xml,如下所示。這有兩個名爲「Param」和「Dimension」的根元素。與兩組節點的區別 - XSLT

Param元素也有一個名爲「Dimension」的子節點,它包含一些名爲「Member」的元素。這有兩個屬性id和名稱。

<Root> 
    <Param> 
     <Pattern id="P1" name="Pattern1"> 
      <Dimension name="Dim1"> 
       <Member id= "1" name="Member1" /> 
       <Member id= "4" name="Member4" /> 
       <Member id= "5" name="Member5" /> 
       <Member id= "6" name="Member6" /> 
       <Member id= "7" name="Member7" /> 
       <Member id= "9" name="Member9" /> 
       <Member id= "10" name="Member10" /> 
       <Member id= "11" name="Member11" /> 
       <Member id= "12" name="Member12" /> 
       <Member id= "13" name="Member13" /> 
       <Member id= "16" name="Member16" /> 
       <Member id= "17" name="Member17" /> 
       <Member id= "18" name="Member18" /> 
       <Member id= "19" name="Member19" /> 
      </Dimension> 
     </Pattern> 
     <Pattern id="P2" name="Pattern2"> 
      <Dimension name="Dim1"> 
       <Member id= "1" name="Member1" /> 
       <Member id= "2" name="Member2" /> 
       <Member id= "3" name="Member3" /> 
       <Member id= "4" name="Member4" /> 
       <Member id= "5" name="Member5" /> 
       <Member id= "6" name="Member6" /> 
       <Member id= "8" name="Member8" /> 
       <Member id= "11" name="Member11" /> 
       <Member id= "12" name="Member12" /> 
       <Member id= "13" name="Member13" /> 
       <Member id= "14" name="Member14" /> 
       <Member id= "15" name="Member15" /> 
       <Member id= "16" name="Member16" /> 
       <Member id= "17" name="Member17" /> 
      </Dimension> 
     </Pattern> 
    </Param> 
    <Dimension name="Dim1"> 
     <Member id= "1" name="Member1" > 
      <Member id= "2" name="Member2" > 
       <Member id= "3" name="Member3" /> 
       <Member id= "4" name="Member4" /> 
       <Member id= "5" name="Member5" /> 
       <Member id= "6" name="Member6" /> 
       <Member id= "7" name="Member7" /> 
      </Member> 
      <Member id= "8" name="Member8" > 
       <Member id= "9" name="Member9" /> 
       <Member id= "10" name="Member10" /> 
       <Member id= "11" name="Member11" /> 
      </Member> 
      <Member id= "12" name="Member12" > 
       <Member id= "13" name="Member13" /> 
       <Member id= "14" name="Member14" /> 
       <Member id= "15" name="Member15" /> 
       <Member id= "16" name="Member16" /> 
       <Member id= "17" name="Member17" /> 
       <Member id= "18" name="Member18" /> 
       <Member id= "19" name="Member19" /> 
       <Member id= "20" name="Member20" /> 
      </Member> 
     </Member> 
    </Dimension> 
</Root> 

來自Pattern/Dimension/Member的成員必須與根Dimension元素進行比較,並且在輸出中需要像下面那樣的區別。

<Root> 
    <Pattern id="P1" name="Pattern1"> 
     <Dimension name="Dim1"> 
      <Member id= "2" name="Member2" /> 
      <Member id= "3" name="Member3" /> 
      <Member id= "8" name="Member8" /> 
      <Member id= "14" name="Member14" /> 
      <Member id= "15" name="Member15" /> 
      <Member id= "20" name="Member20" /> 
     </Dimension> 
    </Pattern> 
    <Pattern id="P2" name="Pattern2"> 
     <Dimension name="Dim1"> 
      <Member id= "7" name="Member7" /> 
      <Member id= "9" name="Member9" /> 
      <Member id= "10" name="Member10" /> 
      <Member id= "18" name="Member18" /> 
      <Member id= "19" name="Member19" /> 
      <Member id= "20" name="Member20" /> 
     </Dimension> 
    </Pattern> 
</Root> 
用於型式1,

相比/根/尺寸//成員,下面的區別在樣品例如發現

Member2 Member3 Member8 Member14 Member15 部件20

相同不同模式的邏輯。是否可以通過XSLT 1.0來實現?任何人都可以幫助這一點。

在此先感謝。

回答

0

首先與身份模板開始......

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

然後,看着你的要求,你只需要在你的輸出Param/Pattern元素,所以你可以通過選擇他們開始...

<xsl:template match="Root"> 
    <xsl:copy> 
     <xsl:apply-templates select="Param/Pattern"/> 
    </xsl:copy> 
</xsl:template> 

Pattern元素本身是不變的,所以會由身份模板來處理,但是要選擇從元素爲孩子Dimension元素不符合當前Dimension,所以模板看起來像這樣

<xsl:template match="Pattern/Dimension"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="/Root/Dimension//Member[not(@id = current()/Member/@id)]" /> 
    </xsl:copy> 
</xsl:template> 

您還需要一個模板停止Member元素的全hieracrhical結構被複制,並且只複製父元一個。

<xsl:template match="Member"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
    </xsl:copy> 
</xsl:template> 

試試這個XSLT

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

    <xsl:template match="Root"> 
     <xsl:copy> 
      <xsl:apply-templates select="Param/Pattern"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Pattern/Dimension"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="/Root/Dimension//Member[not(@id = current()/Member/@id)]" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Member"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
     </xsl:copy> 
    </xsl:template> 

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

感謝蒂姆,它的工作。再次感謝大家 –

+0

嗨添,從上面的一個更多的幫助。你能解釋我如何從上面的答案只獲得父節點。就像在輸出中一樣,需要跳過成員3,因爲它是成員2'代碼'的子成員 'code' –

+0

這可能是最好的,你問一個全新的單獨的問題,因爲它很難在評論中閱讀代碼。謝謝 –