как выйти из шаблона преждевременно? - PullRequest
3 голосов
/ 11 июля 2011

Как выйти из шаблона преждевременно

1002 * Как я хочу:
<xsl:template match="asd">
    <xsl:if test="$true">EXIT TEMPLATE()</xsl:if>
    <!--my main code here-->
</xsl:template>

Я делаю это так сейчас (который работает, конечно), но неоспоримо выше кодгораздо аккуратнее, если есть вариант, который работает:

<xsl:template match="asd">
            <xsl:choose>
                <xsl:when test="$true"></xsl:when>
                <xsl:otherwise>
                    <!--my main code here-->
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>

Ответы [ 3 ]

3 голосов
/ 11 июля 2011

Есть несколько способов сделать это. Если ваше условие не содержит ссылку на переменную / параметр (что не разрешено в шаблонах сопоставления в XSLT 1.0), просто переместите его вверх в шаблон сопоставления, например, так:

<xsl:template match="asd[not(<some_boolean_expression>)]">
    <!--my main code here-->
</xsl:template>

Если $true является ссылкой на переменную / параметр, тогда условно применяются шаблоны:

<xsl:template match="parent_of_asd">
    <xsl:apply-templates select="asd[not($true)]"/>
</xsl:template>

<xsl:template match="asd">
    <!--my main code here-->
</xsl:template>
3 голосов
/ 11 июля 2011

Вы не можете делать именно так, как вы описываете;XSLT - это декларативный, а не процедурный язык, он на самом деле не разработан с учетом «потока программ».Однако, перефразируя ваш пример, вы можете сделать следующее:

<xsl:template match="asd[not($true)]">
  <!--my main code here-->
</xsl:template>

Недостатком этого является то, что он не позволяет вам вводить шаблон в первую очередь, поэтому вы не можете иметь ничего до 'if'.

NB. Строго говоря, спецификация для XSLT1.0 не должна разрешать переменные в условиях совпадения, как это, но многие движки XSLT 1.0 будут делать это в любом случае, и это только проблема, если выНа самом деле условие имеет такую ​​переменную.Однако XSLT 2.0 официально разрешает это.

2 голосов
/ 12 июля 2011

Если:

  • вы не используете XSLT 2.0 (ответ @ Флинна)
  • вы не хотите избавляться от ссылки на переменную или использовать подход apply-templates (@ Ответ Ивбурка)

Вы все еще можете использовать xsl:if и работать с подходом негативной логики:

<xsl:if test="not($true)">
 <!--your main code here-->
</xsl:if>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...