xsl模板,如果它具有空属性

时间:2015-12-23 03:12:58

标签: xml xslt

我有一个XML,它有多个父节点,每个节点都有不同的属性。另外,我有几个空子节点到这些父节点和几个空标题,即只有父节点有属性但没有子节点。

我希望以这样的方式对其进行格式化,使得我的输出XML没有具有空属性的节点,即需要一个删除整个节点的xsl模板如果它包含一个空属性。

我申请了一个模板;只能删除空属性但不能删除保存空属性的节点。也, 当我试图删除空标题时,它也删除了我不想要的空子节点!

所以,我只需要一个模板来删除保存空属性的节点本身。

2 个答案:

答案 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>