Объединение нескольких шаблонов XSLT с похожими совпадениями

У меня есть этот XSLT ниже

<xsl:template match="word[@italic = 'y']">
        <p>
                <xsl:attribute name="i">yes</xsl:attribute>
                <xsl:apply-templates/>
        </p>
</xsl:template>

<xsl:template match="word[@bold = 'y']">
        <p>
                <xsl:attribute name="b">yes</xsl:attribute>
                <xsl:apply-templates/>
        </p>
</xsl:template>

<xsl:template match="word[@underline = 'y']">
        <p>
                <xsl:attribute name="u">yes</xsl:attribute>
                <xsl:apply-templates/>
        </p>
</xsl:template>

Есть ли способ объединить эти шаблоны в один вложенный блок, используя переменную, которая выглядит примерно так: курсив | жирный | подчеркнуть, а также отразить изменения в ‹xsl:attribute name=XXX›? Спасибо.


person richtigga    schedule 27.01.2021    source источник


Ответы (1)


Обычный подход к комбинированию шаблонов соответствия:

<xsl:template match="word[@italic = 'y'] | word[@bold = 'y'] | word[@underline = 'y']">

Что касается преобразования атрибутов, разве вы не можете просто использовать

<xsl:template match="word">
  <p>
    <xsl:apply-templates select="@* | node()"/>
  </p>
</xsl:template>

плюс шаблоны для атрибутов, например.

<xsl:template match="word/@italic[. = 'y']">
  <xsl:attribute name="i">yes</xsl:attribute>
</xsl:template>

и так далее?

Или, возможно,

<xsl:template match="word/@italic[. = 'y'] | word/@bold[. = 'y'] | word/@underline[. = 'y']">
  <xsl:attribute name="{substring(local-name(), 1, 1)}">yes</xsl:attribute>
</xsl:template>
person Martin Honnen    schedule 27.01.2021