避免使用XSLT输出HTML的不匹配标签

时间:2012-01-01 17:44:12

标签: xslt

我是XSLT的新手,尽管有数小时的时间寻找答案,但有一件我不知道该怎么办的具体事情。

我正在输出HTML块(结果集),有时结果是超链接,有时则不是。

简单的流程如下所示:

<a...> if @url

some HTML code

</a> if @url

但如果我这样做:

when @url
<a...>
/when

some HTML code

when @url
</a>
/when

......我被告知我的标签不匹配。

我使用CDATA文本作为锚点集,但很多消息都说这是一种“黑客”方法。

我试图避免重复整个HTML代码块只是为了只在其中一个包含锚点。

我该怎么做?

-------编辑/附加信息-----------

这更有意义吗?

            <xsl:template match="Row">

                            <xsl:choose>
                            <xsl:when test="@url!=''">
                                    <a><xsl:attribute name="href"><xsl:value-of select="@url" /></xsl:attribute>
                            </xsl:when>
                            </xsl:choose>       

                                    <img />

                            <xsl:choose>
                            <xsl:when test="@url!=''">
                                    </a>
                            </xsl:when>
                            </xsl:choose>       

            </xsl:template>

2 个答案:

答案 0 :(得分:3)

在XSLT中,您的输出是节点树。编写元素节点是单个原子操作;它不能分成编写开始标记和编写结束标记的单独操作。你不能创建半个节点。

如果您尝试将<a></a>视为单独且可分离的操作,则会出现此错误,因为样式表必须是格式良好的XML。

所以,请退一步说明你想要实现的目标,然后我们就可以告诉你如何在XSLT中正确实现它。

答案 1 :(得分:1)

重构XSLT以有条件地应用超链接并且不重复逻辑来生成<img/>(或者您试图避免重复的任何更复杂的逻辑)的一种方法是将该逻辑提取到不同的模板作为命名模板或具有@mode 的模板。

例如:

  <xsl:template match="Row">
    <xsl:choose>
        <xsl:when test="@url!=''">

          <a>
            <xsl:attribute name="href">
                <xsl:value-of select="@url"/>
            </xsl:attribute>
            <xsl:apply-templates select="." mode="image"/>
          </a>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates select="." mode="image"/>
        </xsl:otherwise>
   </xsl:choose>             
  </xsl:template>

    <!--The "common" logic to produce an image element, whether or not it will be surrounded by an anchor linking to the @url -->
<xsl:template match="Row" mode="image">
    <img/>
</xsl:template>

完成相同操作的另一种方法,但使用模板而不是<xsl:choose>

  <xsl:template match="Row[@url]">
    <a href="@url">
        <xsl:apply-templates select="." mode="image"/>
    </a>
  </xsl:template>

  <xsl:template match="Row">
        <xsl:apply-templates select="." mode="image"/>            
  </xsl:template>

  <xsl:template match="Row" mode="image">
        <img/>
  </xsl:template>