Подтвердить что ты не робот

Может ли шаблон XSL соответствовать * ALL * режимам?

Есть ли способ написать шаблон XSL 1.0, который соответствует во всех режимах?

Или мне нужно написать отдельный шаблон для каждого существующего режима (включая дополнительные шаблоны для добавленных режимов в будущем)?

Вот что у меня есть:

<xsl:apply-templates mode="mode1" />
    ...
<xsl:apply-templates mode="mode2" />
    ...
<!-- Do not process text content of nodes no matter in what mode -->
<!-- Is there a way to have only one template here? -->
<xsl:template match="text()" mode="mode1" />
<xsl:template match="text()" mode="mode2" />
4b9b3361

Ответ 1

Предопределенный режим: #all (только в XSLT 2.0).

edit: репликация режима совместного использования с 1.0

<xsl:template match="/">
    <xsl:variable name="choice" select="'a'"/><!-- input seed here -->
    <xsl:choose>
        <xsl:when test="$choice='a'">
            <xsl:apply-templates mode="a"/>
        </xsl:when>
        <xsl:when test="$choice='b'">
            <xsl:apply-templates mode="b"/>
        </xsl:when>
    </xsl:choose>
</xsl:template>

<xsl:template match="*" mode="a">
    [A]
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="*" mode="b">
    [B]
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="text()">
    [ALL]
</xsl:template>

Ответ 2

Есть ли способ написать XSL 1.0 шаблон, который соответствует всем Режимы

Да, для этого нужно следовать этим двум правилам:

  • Напишите свой шаблон без атрибута режима.

  • В модеризованных шаблонах есть команда <xsl:apply-templates> без атрибута режима, что приведет к тому, что шаблон в 1. выше будет выбран для обработки

Это следует непосредственно из XSLT 1.0 spec, который гласит:

Если элемент xsl:apply-templates имеет a mode, тогда он применяется только к тем правилам шаблонов из xsl:template элементы с modeатрибут с тем же значением; если Элемент xsl:apply-templates не имеют атрибут mode, тогда он применяется только к тем правилам шаблонов из xsl:template элементы, которые не имеют a mode.

Подводя итог: набор шаблонов, каждый в другом режиме, может все еще выдавать <xsl:apply-templates> таким образом (описанным выше), так что для обработки будет выбран один и тот же конкретный единственный шаблон в каждом случае.

Ответ 3

Если вы хотите, чтобы совпадение с шаблоном во всех режимах, почему вы используете режим? Если вы не используете режим, шаблон будет использоваться все время. Причиной режима является условное выполнение разных действий с одним и тем же типом данных. Похоже, вы хотите немодального.