XSLT - используйте переменную для хранения атрибутов для сопоставления в шаблонах - PullRequest
2 голосов
/ 16 июля 2009

У меня есть два шаблона, соответствующих одним и тем же атрибутам, оба с разными режимами (показано ниже). Есть ли способ, которым я могу избежать записи атрибутов дважды, по одному для каждого шаблона, и вместо этого сохранить эти атрибуты, скажем, в переменной? Таким образом, вместо приведенных ниже операторов сопоставления, у меня будет совпадение типа match = $ styleAttributes , а styleAttributes будет установлено для всех атрибутов. Это будет использовать версию 2.0 (Saxon 9.1.0.7). Спасибо.

<xsl:template match="@width|@height|@visible|@vAlign|@hAlign|@zOrder|@hOffset|@vOffset|@color|@fontSize" mode="styles">
    <!-- Do something -->
</xsl:template> 

<!-- Do nothing -->     
<xsl:template match="@width|@height|@visible|@vAlign|@hAlign|@zOrder|@hOffset|@vOffset|@color|@fontSize" mode="common" />

Ответы [ 2 ]

1 голос
/ 25 июля 2009

Даже в XSLT 2.0 шаблон совпадения может содержать проверяемую ссылку только как часть предиката или как часть аргумента (выражения) для Клавиша () или id () функции. Это определяет отрицательный ответ на прямой вопрос.

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

Вот небольшой пример :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 >
 <xsl:output method="text"/>

    <xsl:template match="/*">
     <xsl:apply-templates select="@*"/>
    </xsl:template>

    <xsl:template match=
    "@width|@height|@visible|@vAlign|@hAlign|@zOrder|@hOffset|@vOffset|@color|@fontSize">
      <xsl:param name="procMode" as="xs:string" select="'common'"/>

     <xsl:sequence select=
      "if($procMode = 'common')
        then
          'Hello from the Common Processor'
        else
          'Hello from the Styles Processor'
      "
      />
    </xsl:template>
</xsl:stylesheet>

Когда вышеуказанное преобразование применено к этому документу XML:

<div width="50"/>

желаемый результат получен:

Привет от общего процессора

1 голос
/ 16 июля 2009

Ну, вы можете сопоставить все с "@*", а затем в шаблоне проверить local-name() с глобальной переменной, а затем вызвать другой шаблон с другим @mode= в зависимости от pass-fail.

SO - потрясающий ресурс, но для вопросов чистого XSLT ничто не сравнится с xsl-list, запущенным Mulberry Technologies. Он широко представлен поставщиками и пользователями продуктов XSLT, а также членами комитетов W3C, отвечающими за спецификации.

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