2017-04-12 209 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>