Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT:打开但不关闭标记_Xslt - Fatal编程技术网

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视为一种命令式编程语言,而不是一种声明性模板工具。您可能会从心态的改变中受益。
禁用输出转义
显然是解决此问题的错误方法,不管是否已被弃用。事实上,我无法思考我何时使用过它。