XSLT:打开但不关闭标记
有没有办法打开标签而不关闭它?例如:XSLT:打开但不关闭标记,xslt,Xslt,有没有办法打开标签而不关闭它?例如: <xsl:for-each select="."> <span> </xsl:for-each> 这是我的代码:。正如您所见,我需要在一个when标记上打开它,并在另一个when标记上关闭它(第43行和第63行) 这段代码是无效的,因为XSLT的格式不好,但是有没有办法做类似的事情呢?谢谢你你不能-XSLT不是生成文本文件或字符序列,而是将一个文档树转换成另一个文档树。树最终被序列化为文本格式是偶然的
<xsl:for-each select=".">
<span>
</xsl:for-each>
这是我的代码:。正如您所见,我需要在一个when标记上打开它,并在另一个when标记上关闭它(第43行和第63行)
这段代码是无效的,因为XSLT的格式不好,但是有没有办法做类似的事情呢?谢谢你你不能-XSLT不是生成文本文件或字符序列,而是将一个文档树转换成另一个文档树。树最终被序列化为文本格式是偶然的 这就是为什么,例如,您不能在输出文件中选择和-它们都表示完全相同的文档树
通过重构成相互调用的单独模板,您几乎总能达到预期效果。将内容在两个现有
xsl:choose
元素之间移动到新模板
在xsl:when
中,打开并关闭span
。在span
中,调用此新模板
在xsl:choose
中添加xsl:other
,在此调用模板,而不添加span
一般来说,尝试更频繁地使用
xsl:apply templates
,而不是xsl:for each
,这样应该更容易理解正在发生的事情。您可以使用禁用输出转义,但这通常被认为是一种攻击,我知道它在XSLT2中被弃用。显然未经测试,但如果我正确理解了您的原始代码,这应该非常接近
<xsl:choose>
<xsl:when test="$pos">
<xsl:for-each select="$s">
<xsl:choose>
<!-- inizio contesto -->
<xsl:when test="$pos[.=position()+$context_number]">
<xsl:text>INIZIO CONTESTO</xsl:text>
</xsl:when>
<!-- fine contesto -->
<xsl:when test="$pos[.=position()-$context_number]">
<xsl:text>FINE CONTESTO</xsl:text>
</xsl:when>
<!-- parola -->
<xsl:when test="$pos[.=position()]">
<span class="word"><xsl:value-of select="."/></span>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position() != last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<!-- stampo tutta la riga -->
<xsl:value-of select="$s"/>
</xsl:otherwise>
</xsl:choose>
竞技场
好的竞赛
提示:
相当于
;-) 为了创造合理的输出,您最终肯定必须关闭它。你到底想干什么?如果您试图将元素的平面列表转换为一组嵌套的跨距,有更好的方法。您的示例代码将只生成一个开头的span
标记(
始终是一个包含1个节点的节点集),因此您不妨先去掉它的每个部分的。对不起,我没有写为什么需要这样的标记。我更新了帖子并添加了代码。您似乎将XSLT视为一种命令式编程语言,而不是一种声明性模板工具。您可能会从心态的改变中受益。禁用输出转义
显然是解决此问题的错误方法,不管是否已被弃用。事实上,我无法思考我何时使用过它。