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