如果特定的子节点不存在,则将其从XSLT XML到XML中删除节点。

5

我是XSL的新手,无法找到有关此问题的信息。这仅适用于XSLT 1.0,并最终将从XSLTproc运行。

以下是一个XML示例:

<root>
    <node>
        <data />
        <child>
            <grandchild />
        </child>
        <step-child action="removenode" />
    </node>
    <node>
        <data />
        <step-child action="removenode" />
    </node>
</root>

基本上,我想保留所有内容,除了:

  • 删除没有<child>的节点
  • 删除所有的<step-child>

我只能想到如何删除不需要的节点,但这仍然值得商榷。非常感谢您的帮助。


我试图摆脱这种感觉,即某个教授建议他或她的学生使用SO来免费完成作业。这些绝对不是真实世界中的问题,而且它们非常简单。我担心通过为这些人做作业,我们剥夺了他们自己学习XSLT的过程或通过浏览可用资源进行学习的机会。至少,我们不应该提供完全功能的XSLT程序,而只是给他们原则,或者指向某个可以提供原则的地方。 - user663031
重复的问题,已经有很多其他人问过了,例如:https://dev59.com/03RC5IYBdhLWcg3wXPsC。请注意查找相关问题和答案,以免浪费时间。 - user663031
我非常同情torazaburo:我总是喜欢专注于帮助提问者克服特定的困难,以便他们可以自己解决问题,而不是给他们一个可行的答案。很明显,像TechZilla这样的人,试图跳过学习新语言的阶段:你不是从尝试解决具体问题开始,而是从广泛阅读有关该语言的性质及其解决问题的一般方法开始。 - Michael Kay
@torazaburo:绝对不是重复问题,元素不是节点。我实际上已经可以通过我已经阅读的内容来解决这个问题了。我已经阅读了关于XSLT通常如何使用的内容,以将特定值放置在模板位置。这不是广泛记录的问题类型,甚至没有任何官方文档的答案。我甚至知道如何删除特定节点,但这是一个学习过程,这就是为什么我发布了这个问题。这就是整个网站存在的目的,不是吗? - J. M. Becker
1
@MichaelKay:顺便说一下,从例子中学习一直是我学习最快的方式。我用同样的方式学习了BASIC、XHTML和XML。我也总是阅读官方文档并完成一些教程,但通常这还不够。就像大多数XSLT示例都是相同类型的,与我所做的非常不同。 - J. M. Becker
显示剩余2条评论
1个回答

10
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <!--Identity template to copy all content by default-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!--Remove node elements that do not have child elements, 
               and remove step-child elements -->
    <xsl:template match="node[not(child)] | step-child"/>

</xsl:stylesheet>

通过负评来表达对为人们做简单的家庭作业问题的想法不满。 - user663031
6
如果是这样的话,那就给问题投反对票 -- 不要投答案的反对票 -- 尤其不要给好的答案投反对票。 - Dimitre Novatchev
2
@torazaburo:这不是作业,我是一名Linux系统管理员,对XSLT还比较新,正在处理自动配置方面的工作。顺便说一句,实际问题甚至比我问的还要复杂,这只是我自己遇到困难的部分。 - J. M. Becker
@MadsHansen:这是我从所有SE网站中收到的最好、最直接的答案之一。我非常感谢你的帮助。 - J. M. Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接