2017-04-12 245 views
0

下面的示例Xml有2個不同的集合,一個是「模式」,另外一個是「成員」。 模式成員的子集。基於父節點刪除子節點

<Root> 
    <Pattern name="A"> 
     <Member id="2" /> 
     <Member id="4"/> 
     <Member id="10"/> 
     <Member id="11"/> 
    </Pattern> 
    <Pattern name="B"> 
     <Member id="3" /> 
     <Member id="4"/> 
     <Member id="10"/> 
     <Member id="11"/> 
     <Member id="12"/> 
     <Member id="13"/> 
    </Pattern> 
    <Members> 
     <Member id="1" name="Member1"> 
      <Member id="2" name="Member2"> 
       <Member id="3" name="Member3"/> 
       <Member id="4" name="Member4"/> 
      </Member> 
      <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> 
      <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> 
       </Member> 
      </Member> 
     </Member> 
    </Members> 
</Root> 

我需要從模式其id屬性與成員的屬性ID進行比較時,有兩家母公司及其子存在刪除子節點條目。

用於上述預期輸出是

<Output> 
<Pattern name="A"> 
     <Member id="2" />  
     <Member id="10"/> 
    </Pattern> 
    <Pattern name="B"> 
     <Member id="3" /> 
     <Member id="4"/> 
     <Member id="10"/> 
     <Member id="12"/> 
    </Pattern> 
</Output> 

模式A: 出的4個成員,成員4是因此構件4具有待去除部件2的子級。會員11是會員10的孩子。因此會員11必須刪除。

其他模式的相同邏輯。

幫我在xslt 1.0中實現這個功能。

感謝

+0

,請複製粘貼您已經嘗試到目前爲止的代碼 – RT72

+0

這似乎是你的前一個問題的副本:http://stackoverflow.com/questions/43352704/find-parent -based-on-children-xslt-1-0在任何情況下,它都與另一個一樣不清楚。 –

回答

0

你可以定義一個鍵通過它們的ID來查找了Member元素

<xsl:key name="members" match="Members//Member" use="@id" /> 

然後,對於一個給定的Pattern/Member元素,你可以像這樣

父ID
<xsl:variable name="parentId" select="key('members', @id)/parent::*/@id" /> 

然後,您可以測試是否需要將當前Member複製到輸出像

<xsl:if test="not(../Member/@id = $parentId)"> 
    <xsl:copy-of select="." /> 
</xsl:if> 

試試這個XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="members" match="Members//Member" use="@id" /> 

    <xsl:template match="Pattern/Member"> 
     <xsl:variable name="parentId" select="key('members', @id)/parent::*/@id" /> 
     <xsl:if test="not(../Member/@id = $parentId)"> 
      <xsl:copy-of select="." /> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="Members" /> 

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

其實,你可以逆轉的邏輯,而是你不想複製Member元素進行檢查。

試試這個XSLT太

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="members" match="Members//Member" use="@id" /> 

    <xsl:template match="Pattern/Member[../Member/@id = key('members', @id)/parent::*/@id]" /> 

    <xsl:template match="Members" /> 

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