【问题标题】:Delete empty nodes删除空节点
【发布时间】:2015-09-15 23:34:42
【问题描述】:

我尝试删除空节点,但不是全部,例如我有标签:

1.<abc></abc> - it should be delete
2.<cde/> - it should not be delete.
3.<fgh/> - it SHOULD be delete.

所以,我想删除第 2 点中的空节点(显式名称“CDE”)

换句话说:当像'cde'这样的标签和标签为空时,然后删除。 : D

有可能吗?

我找到了删除所有空节点的代码:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*[descendant::text() or descendant-or-self::*/@*[string()]]">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@*[string()]">
    <xsl:copy/>
</xsl:template>

</xsl:stylesheet>

编辑:

XML 看起来像:

<system/>
            <smth></smth>
            <smth2>?</smth2>
            <smth3>?</smth3>
            <smth4></smth4>
            <smth4></smth4>
            <smth5/>

XML 可以包含很多标签,比如 - 所以我已经动态地删除了它们。 一些看起来我想删除的标签。但是在这个 XML 中应该保留。

所以 XML 输出应该是这样的:

 <system/>
                <smth2>?</smth2>
                <smth3>?</smth3>




I found the solution: http://xsltransform.net/nc4NzRx/3. : )

【问题讨论】:

  • 您的要求似乎矛盾。
  • 为什么?我只是不想删除显式标签。在这种情况下名称:CDE。
  • 但是你的问题是“2. - 它不应该被删除。”然后是“我想删除第 2 点中的空节点(显式名称“CDE”)”,因此第一个引用的句子与第二个引用的句子相矛盾。
  • 哦,对了!当然。我的错。我不想删除第 2 点中的空节点。如果我的 xml 看起来像:? 输出应该看起来像:?
  • 这个恐怕还是不清楚。您可以 (a) 删除除显式命名的空节点之外的所有空节点,或 (b) 仅删除显式命名的空节点。 --附言请不要在 cmets 中发布代码;改为编辑您的问题。

标签: xml xslt


【解决方案1】:

如果您想复制所有内容但删除空的 cde 元素,请使用带有以下两个模板的样式表

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

<xsl:template match="cde[not(node())]"/>

【讨论】:

  • 你好,马丁。不幸的是它不起作用......我做错了什么吗?你能检查一下吗? xsltransform.net/gWmuiKt
  • 我作为完整样式表的建议类似于xsltransform.net/nc4NzRx,而不是您尝试过的。
  • 马丁谢谢。这几乎是我想要的。是否可以删除看起来像 的标签?就像这里:xsltransform.net/nc4NzRx/1。在这种情况下:correlationId。输出应该看起来像现在没有相关ID。
  • 如果您将&lt;xsl:template match="cde[not(node())]"/&gt; 更改为&lt;xsl:template match="cde[not(node())] | correlationId[not(node())]"/&gt;,那么空的correlationId 元素也会被删除。
  • 不完全是,我想删除所有 (不明确),我想删除我指出的 标签的某些部分。