XSLT:打开但不是关闭标签

时间:2010-05-20 09:17:16

标签: xslt

有没有办法打开标签而不关闭它?例如:

<xsl:for-each select=".">
       <span>
</xsl:for-each>

这是我的代码:http://pastebin.com/1Xh49YN0。正如你所看到的,我需要打开一个标签,然后在另一个标签上关闭它(第43和63行)。

这段代码无效,因为XSLT格式不正确,但有没有办法做类似的事情?谢谢

4 个答案:

答案 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">。 ; - )