2016-10-31 35 views
1

我有以下几点:删除两位家长在XSL

..

<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> 

所以我还是需要删除下的。我如何通过一次转换来做到这一点?

回答

1

一种方法是简单地用一个更针对性的一个选择孙节点替换当前xsl:apply-templates

<xsl:apply-templates select="*/Node"/> 

例如,试试这个XSLT

<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> 

另外,添加模板也忽略您想忽略的节点的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> 
+0

谢谢,我尝试了您建议的第一个XSLT,并像魅力一样工作。 –