在XSL中删除两个父项

时间:2016-10-31 09:30:29

标签: xml xslt

我有以下内容:

...

<ContentsNodes>
    <Node id="14003"/>
    <Node id="13944"/>
    <Node id="292"/>
    <Node id="8418">
        <ChildNodes>
            <Node id="8420"/>
            <Node id="8421"/>
            <Node id="47316">
                <ChildNodes>
                    <Node id="8423"/>
                    <Node id="8424"/>
                    <Node id="8425"/>
                    <Node id="8426"/>
                    <Node id="8427"/>
                    <Node id="15682"/>
                </ChildNodes>
            </Node>
            <Node id="55240">
                <ChildNodes>
                    <Node id="8429"/>
                    <Node id="8430"/>
                </ChildNodes>
            </Node>
            <Node id="8431"/>
            <Node id="55241">
                <ChildNodes>
                    <Node id="8433"/>
                    <Node id="8434"/>
                    <Node id="8435"/>
                    <Node id="8436"/>
                    <Node id="8439"/>
                    <Node id="8440"/>
                    <Node id="8441"/>
                    <Node id="8438"/>
                </ChildNodes>
            </Node>
            <Node id="12977"/>
            <Node id="2340"/>
        </ChildNodes>
    </Node>
</ContentsNodes>

...

我想:

  • 摆脱<Node id="47316">
  • 摆脱<Node id="55240">
  • 使两个节点的子节点与<Node id="8421"/>处于同一级别。

换句话说:

<ContentsNodes>
<Node id="14003"/>
<Node id="13944"/>
<Node id="292"/>
<Node id="8418">
    <ChildNodes>
        <Node id="8420"/>
        <Node id="8421"/>
        <Node id="8423"/>
        <Node id="8424"/>
        <Node id="8425"/>
        <Node id="8426"/>
        <Node id="8427"/>
        <Node id="15682"/>
        <Node id="8429"/>
        <Node id="8430"/>
        <Node id="8431"/>
        <Node id="55241">
            <ChildNodes>
                <Node id="8433"/>
                <Node id="8434"/>
                <Node id="8435"/>
                <Node id="8436"/>
                <Node id="8439"/>
                <Node id="8440"/>
                <Node id="8441"/>
                <Node id="8438"/>
            </ChildNodes>
        </Node>
        <Node id="12977"/>
        <Node id="2340"/>
    </ChildNodes>
</Node>
</ContentsNodes>

我能够删除多余的节点:

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

<xsl:template match="//path/to/Node[3]">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="//path/to/Node[4]">
    <xsl:apply-templates/>
</xsl:template>

但我最终得到了:

<ContentsNodes>
<Node id="14003"></Node>
<Node id="13944"></Node>
<Node id="292"></Node>
<Node id="8418">
    <ChildNodes>
        <Node id="8420"></Node>
        <Node id="8421"></Node>

            <ChildNodes>
                <Node id="8423"></Node>
                <Node id="8424"></Node>
                <Node id="8425"></Node>
                <Node id="8426"></Node>
                <Node id="8427"></Node>
                <Node id="15682"></Node>
            </ChildNodes>

            <ChildNodes>
                <Node id="8429"></Node>
                <Node id="8430"></Node>
            </ChildNodes>

        <Node id="8431"></Node>
        <Node id="55241">
              <ChildNodes>
                <Node id="8433"></Node>
                <Node id="8434"></Node>
                <Node id="8435"></Node>
                <Node id="8436"></Node>
                <Node id="8439"></Node>
                <Node id="8440"></Node>
                <Node id="8441"></Node>
                <Node id="8438"></Node>
            </ChildNodes>
        </Node>
        <Node id="12977"></Node>
        <Node id="2340"></Node>
    </ChildNodes>
</Node>
</ContentsNodes>

所以我仍然需要删除<ChildNodes>下的<Node id="8421"></Node>。如何通过一次转换实现这一目标?

1 个答案:

答案 0 :(得分:1)

一种方法是简单地将当前xsl:apply-templates替换为选择孙子节点的更具针对性的<xsl:apply-templates select="*/Node"/>

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

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

    <xsl:template match="Node[@id = '47316' or @id = '55240']">
        <xsl:apply-templates select="*/Node"/>
    </xsl:template> 
</xsl:stylesheet>

例如,试试这个XSLT

ChildNode

或者,添加一个模板,该模板也会忽略您要忽略的节点的<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="xml" indent="yes" /> <xsl:strip-space elements="*" /> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="Node[@id = '47316' or @id = '55240']"> <xsl:apply-templates /> </xsl:template> <xsl:template match="Node[@id = '47316' or @id = '55240']/*"> <xsl:apply-templates /> </xsl:template> </xsl:stylesheet> 元素

// change non-opaque pixels to white
var imgData=ctx.getImageData(0,0,canvas.width,canvas.height);
var data=imgData.data;
for(var i=0;i<data.length;i+=4){
    if(data[i+3]<255){
        data[i] = 255 - data[i];
        data[i+1] = 255 - data[i+1];
        data[i+2] = 255 - data[i+2];
        data[i+3] = 255 - data[i+3];
    }