有没有办法打开标签而不关闭它?例如:
<xsl:for-each select=".">
<span>
</xsl:for-each>
这是我的代码:http://pastebin.com/1Xh49YN0。正如你所看到的,我需要打开一个标签,然后在另一个标签上关闭它(第43和63行)。
这段代码无效,因为XSLT格式不正确,但有没有办法做类似的事情?谢谢
答案 0 :(得分:6)
将两个现有xsl:choose
元素之间的内容移动到新模板
在xsl:when
中,打开并关闭span
。在span
内,调用此新模板。
向xsl:otherwise
添加xsl:choose
,在此处调用模板,而不添加span
。
总的来说,尝试更频繁地使用xsl:apply-templates
,而不是xsl:for-each
,这样可以更容易理解正在发生的事情。
答案 1 :(得分:3)
你不能 - XSLT不是关于生成文本文件或字符序列,而是关于将一个文档树转换为另一个文档树。树最终被序列化为文本格式是偶然的。
这就是为什么,例如,你不能在输出文件之间和输出文件中选择它们 - 它们都代表完全相同的文档树。
您几乎总能通过重构到相互调用的单独模板来实现预期目标。
答案 2 :(得分:1)
你可以使用disable-output-escaping,但它通常被认为是一个黑客,我知道它在XSLT 2中已被弃用。
答案 3 :(得分:0)
显然,未经测试,但如果我正确理解您的原始代码,这应该非常接近。
<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>
提示:<xsl:when test="(. - $current_pos) eq 0">
相当于<xsl:when test=".=$current_pos">
。 ; - )