与两组节点的区别 - XSLT

时间:2017-03-01 07:02:20

标签: xslt

我有一个样本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实现?任何人都可以帮忙解决这个问题。

提前致谢。

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元素,您要从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>