1

在一个xsl:stylesheet我有这个“类似身份”的转换,以消除评论、空(终端)标签和空属性......但第二个 xsl:when不起作用

  <xsl:template match="node()">
  <xsl:choose>
    <xsl:when test="name()='p' and not(./*) and not(normalize-space(.))"></xsl:when>
    <xsl:when test="not(name()='img') and not(name()='br') and not(./*) and not(text())"
    ></xsl:when> <!-- this line NOT WORKS -->
    <xsl:otherwise><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:otherwise>
  </xsl:choose>
  </xsl:template>

  <xsl:template match="@*">
  <xsl:choose>
    <xsl:when test="not(normalize-space(.))"></xsl:when>
    <xsl:otherwise><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:otherwise>
  </xsl:choose>
  </xsl:template>

  <xsl:template match="comment()"></xsl:template>

在这种情况下,谁向空标签表达条件?

PS:这里解释了“空规则” ,我尝试使用它,但不明白为什么不起作用。

4

1 回答 1

1

空元素是没有子节点的元素。

模板匹配优先级是您的朋友……以下应该是符合您描述的身份样式表以及我认为您正在使用图像和中断元素所做的事情。

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

<!--toss these-->
<xsl:template match="comment() | 
                    *[not(node())] |
                    @*[not(normalize-space())]"/>

<!--preserve these-->
<xsl:template match="img|br" priority="1">
  <xsl:call-template name="identity"/>
</xsl:template>

<!--preserve everything else-->
<xsl:template match="@*|node()" name="identity">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2013-08-02T20:47:50.473 回答