我有一个样本Xml,如下所示。这有两个名为“Param”和“Dimension”的根元素。
Param Element还有一个名为“Dimension”的子节点,它包含一些名为“Member”的元素。这有两个属性id和name。
<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元素进行比较,并且在out out中需要区别如下。
<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>
for Pattern1, 与/ Root / Dimension // Members相比,下面的差异在示例
中找到Member2 Member3 Member8 Member14 Member15 部件20
不同模式的逻辑相同。是否有可能通过XSLT 1.0实现?任何人都可以帮忙解决这个问题。
提前致谢。
答案 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
元素,您要从Member
元素中选择Root\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>