XSLT как выбрать шаблон на основе атрибута - PullRequest
2 голосов
/ 29 сентября 2010

В таблице стилей я хотел бы выбрать шаблон на основе атрибута в исходном XML.К сожалению, похоже, что нельзя использовать атрибут mode apply-templates, так как это должен быть литерал qname.Есть ли другой подобный способ сделать это?

Пример:

source xml:

...
<document type="1">
    <item>...</item>
</document>
...

таблица стилей:

...
<xsl:template match="document">
    <xsl:apply-templates select="item" mode="{@type}" />
</xsl:template>

<xsl:template match="item" mode="1">
    ...
</xsl:template>

<xsl:template match="item" mode="2">
    ...
</xsl:template>

1 Ответ

2 голосов
/ 29 сентября 2010

Простой ответ: сопоставление с образцом.

<xsl:template match="item[../@type = 'whatever']"/>

Второй простой ответ: когда вам нужны ссылки на переменные или параметры (вы не можете использовать их в шаблонах), используйте инструкцию xsl:choose.

<xsl:template match="item">
   <xsl:param name="pType"/>
   <xsl:choose>
      <xsl:when test="$pType = 'whatever'">
      </xsl:when>
      <xsl:when test="$pType = 'otherthing'">
      </xsl:when>
   </xsl:choose>
</xsl:template>

Сложный ответ: используйте именованную ссылку на шаблон.

<xsl:variavle name="vTemplate" select="document('')/xsl:template/@name"/>

<xsl:template match="xsl:template/@name[.='typeA']" name="typeA">
   <xsl:param name="pContext"/>
</xsl:template>

<xsl:template match="xsl:template/@name[.='typeB']" name="typeB">
   <xsl:param name="pContext"/>
</xsl:template>

<xsl:template match="document">
   <xsl:apply-templates select="$vTemplate[.='typeA']">
      <xsl:with-param name="pContext" select="item"/>
   </xsl:apply-templates>
</xsl:template>

Или посмотрите на Димитра FXSL .

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