【问题标题】:XSLT XML to XML Remove node if specific child not does not existXSLT XML to XML 如果特定子节点不存在,则删除节点
【发布时间】:2012-06-01 21:32:46
【问题描述】:

我是 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>

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

  • 删除任何没有&lt;child&gt;的节点
  • 删除所有&lt;step-child&gt;

我只能弄清楚如何删除不需要的节点,但即使这样也是值得怀疑的。我非常感谢您对此提供的任何帮助。

【问题讨论】:

  • 我试图摆脱某些教授向他或她的学生建议他们使用 SO 作为免费完成家庭作业的一种方式的感觉。这些绝对不是现实世界的问题,而且非常简单。恐怕通过为这些人做功课,我们剥夺了他们自己或通过浏览可用资源来学习 XSLT 的过程。至少,我们不应该提供功能齐全的 XSLT 程序,而应该只是为它们提供原理,或者将它们指向可以提供的地方。
  • stackoverflow.com/questions/321860/… 和许多其他人的副本。
  • 我非常同情 torazaburo:我总是喜欢专注于帮助提问者克服特定的困难,以便他们自己解决问题,而不是给他们一个有效的答案。很明显,TechZilla 和许多其他人一样,正在尝试跳过学习新语言的阶段:您不是从尝试解决特定问题开始,而是从广泛阅读该语言的性质及其一般方法开始解决问题。
  • @torazaburo:绝不是重复的问题,元素不是节点。我实际上已经可以用我已经读过的内容来计算答案。我已经阅读了 XSLT 通常是如何使用的,将特定值放在模板位置。这不是广泛记录的问题类型,甚至在任何官方文档答案中都没有。我什至知道如何删除特定节点,但这是一个学习过程,这就是我发布问题的原因。这就是整个网站的用途,不是吗?
  • @MichaelKay:顺便说一句,从例子中学习,一直是我学习最快的方法。我以同样的方式学习了 BASIC、XHTML 和 XML。我也经常阅读官方文档,阅读一些教程,但通常还不够。它就像大多数 XSLT 示例都是同一类型,这与我正在做的非常不同。

标签: xml xslt


【解决方案1】:
<?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>

【讨论】:

  • 投反对票以表达对为人们做简单家庭作业的想法的不满。
  • @torazaburo:如果是这样,那么请否决这个问题——而不是答案——尤其是不是一个好的答案。
  • @torazaburo:这不是家庭作业,我是一名 Linux 系统管理员,对 XSLT 有点陌生,使用自动配置。顺便说一句,实际问题甚至比我问的还要多,这只是我自己遇到的问题。
  • @MadsHansen:这是我从任何 SE 站点中获得的最好、最直接的答案之一。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多