我有一个XML,它有多个父节点,每个节点都有不同的属性。另外,我有几个空子节点到这些父节点和几个空标题,即只有父节点有属性但没有子节点。
我希望以这样的方式对其进行格式化,使得我的输出XML没有具有空属性的节点,即需要一个删除整个节点的xsl模板如果它包含一个空属性。
我申请了一个模板;只能删除空属性但不能删除保存空属性的节点。也, 当我试图删除空标题时,它也删除了我不想要的空子节点!
所以,我只需要一个模板来删除保存空属性的节点本身。
答案 0 :(得分:1)
很难说没有看到样本,但删除节点的最简单方法是不复制它。如果适当的属性为空,则可以使用递归复制模板执行此操作,该模板将省略复制部分。
这样的事情(未经测试)可能会成功。
<xsl:template match="*">
<xsl:choose>
<xsl:when test="@foo = ''">
<xsl:apply-templates/>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Parfait的版本绝对是一种类似于XSLT的方式。为了便于阅读,我倾向于这样做,因为它将所有逻辑保存在一个模板中。 Parfait的版本也可以让你更容易放弃省略内容的新条件。如果遗漏规则变得复杂,我的版本会变得混乱。然后他肯定会更具可读性。
答案 1 :(得分:0)
考虑以下通用XSLT,它运行身份转换以按原样复制整个文档,并运行空模板匹配以删除所需的项目。如果您需要特定的属性或节点,请将*
替换为特定的命名项:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<!-- Identity Transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Removes all nodes with any empty text -->
<xsl:template match="*[.='']"/>
<!-- Removes all nodes with any empty attribute -->
<xsl:template match="*[@*='']"/>
</xsl:transform>