Может ли шаблон XSL соответствовать в режимах * ALL *? - PullRequest
13 голосов
/ 26 января 2009

Есть ли способ написать шаблон 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" />

Ответы [ 3 ]

7 голосов
/ 26 января 2009

Предопределенный режим: #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 голосов
/ 26 января 2009

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

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

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

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

Это следует непосредственно из спецификации XSLT 1.0 , , которая гласит :

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

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

1 голос
/ 26 января 2009

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

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