2017-03-01 46 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

这可能是最好的,你问一个全新的单独的问题,因为它很难在评论中阅读代码。谢谢 –