XSLT: открывать, но не закрывать теги - PullRequest
2 голосов
/ 20 мая 2010

Есть ли способ открыть тег, а не закрыть его? Например:

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

Это мой код: http://pastebin.com/1Xh49YN0. Как вы видите, мне нужно открыть тег «когда» и закрыть его другим тегом «когда» (строки 43 и 63).

Этот фрагмент кода недопустим, потому что XSLT не очень хорошо сформирован, но есть ли способ сделать подобное? Спасибо

Ответы [ 4 ]

6 голосов
/ 20 мая 2010

Перемещение содержимого между двумя существующими элементами xsl:choose в новый шаблон

В xsl:when откройте и закройте span. Внутри span назовите этот новый шаблон.

Добавьте xsl:otherwise к xsl:choose, при этом вызовите шаблон без добавления span.

Как правило, попробуйте использовать xsl:apply-templates чуть чаще, чем xsl:for-each, это должно облегчить понимание происходящего.

3 голосов
/ 20 мая 2010

Вы не можете - XSLT не о генерации текстового файла или последовательности символов, а о преобразовании одного дерева документов в другое. То, что дерево в конечном итоге сериализуется в текстовый формат, является случайным.

Вот почему, например, вы не можете выбирать между и в выходном файле - они оба представляют одно и то же дерево документов.

Вы почти всегда можете достичь того, что задумано, путем рефакторинга в отдельные шаблоны, которые вызывают друг друга.

1 голос
/ 20 мая 2010

Вы можете использовать отключение-вывод-экранирование, но это обычно считается хаком, и я понимаю, что в XSLT 2 это устарело.

0 голосов
/ 20 мая 2010

Не проверено, очевидно, но если я правильно понял ваш исходный код, это должно быть довольно близко.

<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">. ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...