我是非常新的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的术语)有很好的建议,那将非常感激。谢谢!
答案 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不会产生任何输出,因此有效地删除了这些元素。