2016-10-31 70 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,並像魅力一樣工作。 –