Может ли шаблон 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" />
Ответы
Ответ 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
Если вы хотите, чтобы совпадение с шаблоном во всех режимах, почему вы используете режим? Если вы не используете режим, шаблон будет использоваться все время. Причиной режима является условное выполнение разных действий с одним и тем же типом данных. Похоже, вы хотите немодального.