删除具有特定属性的内部节点

时间:2016-03-13 15:07:26

标签: xml xslt

我是非常新的XSLT,并且在尝试删除包含多个节点中某些属性的节点时遇到问题。我真的不知道术语(这使得在互联网上找到合适的答案真的很难),所以下面的代码可能会解释我想要的东西比我能做的更好。

原件:

<xml version="1.0" encoding="utf-8">
<pages>
   <page id="main" default="true">
      <tabs>
         <tab id="login" default="true"/>
         <tab id="picture" default="true"/>
         <tab id="password"/>
      </tabs>
   <page id="secondary" default="true">
      <tabs>
         <tab id="pin" default="true"/>
         <tab id="picture" default="true"/>
      </tabs>
   </page>
   <page id="logout" default="true">
      <tabs>
         <tab id="goodbye"/>
         <tab id="login" default="true"/>
      </tabs>
   </page>
</pages>

目标:我想通过并删除所有图片元素。

<xml version="1.0" encoding="utf-8">
<pages>
   <page id="main" default="true">
      <tabs>
         <tab id="login" default="true"/>
         <tab id="password"/>
      </tabs>
   <page id="secondary" default="true">
      <tabs>
         <tab id="pin" default="true"/>
      </tabs>
   </page>
   <page id="logout" default="true">
      <tabs>
         <tab id="goodbye"/>
         <tab id="login" default="true"/>
      </tabs>
   </page>
</pages>

我有一个xslt,但它没有做我想要的,所以我离开下面我认为可以做到这一点的xslt有点类似。我的想法是我需要进入每个页面,所以不要提供具体的名称,然后一旦我们进入选项卡寻找图片ID,如果它在那里...不要复制它...否则复制一切像往常一样。

<xsl:template match="p:pages/p:page/p:tabs/p:tab>
    <xsl:copy>
        <xsl:if test=not("picture")>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:if>
    </xsl:copy>
</xsl:template>

此外,如果有人对学习基础知识(或至少是XSLT的术语)有很好的建议,那将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

以下样式表可以

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

<xsl:template match="tab[@id='picture']"/>

</xsl:stylesheet>

它有两个模板 - 一个只是递归复制输入文档的通用模板 - 一个特定于tab个元素,其图片ID不会产生任何输出,因此有效地删除了这些元素。