==i-attributes.xsl

===Описание
Модуль для унифицированной работы с html-атрибутами, например, ##class##, ##id##, ##href## и т.д.

{{TOC}}

===Паттерн использования
Для того, чтобы получить атрибут с именем ##attr##, нужно заматчиться на что-нибудь (как правило, это ##.##) с ##mode="lego:attr"## и определить шаблон с ##mode="lego:attr-content"##.

Примеры:

====Атрибут задан в xml
Мы можем прямо в xml задать атрибут элементу:
%%(html)
    ...
    <lego:item id="my-id">...</lego:item>
%%

И тогда в xsl мы создаем атрибут вот так:
%%(html)
<xsl:template match="lego:item">
    <li>
        <xsl:apply-templates select="." mode="lego:id"/>
        ...
    </li>
</xsl:template>
%%
На выходе получаем:
%%(html)
<li id="my-id">...</li>
%%

====Атрибут задан через xsl
%%(html)
<xsl:template match="lego:item">
    <li>
        <xsl:apply-templates select="." mode="lego:id"/>
        ...
    </li>
</xsl:template>

<xsl:template match="lego:item" mode="lego:id-content">
    <xsl:text>my-id</xsl:text>
</xsl:template>
%%



===Как это работает
Все нижеописанные (за вычетом нескольких исключений) шаблоны для атрибутов определены примерно вот так:
%%(html)
<xsl:template match="lego:*" mode="lego:attr">
    <xsl:call-template name="lego:attribute-if-content">
        <xsl:with-param name="name" select="'attr'"/>
        <xsl:with-param name="content">
            <xsl:apply-templates select="." mode="lego:attr-content"/>
        </xsl:with-param>
    </xsl:call-template>
</xsl:template>

<xsl:template match="lego:*" mode="lego:attr-content"/>

<xsl:template match="lego:*[@attr]" mode="lego:attr-content">
    <xsl:value-of select="@attr"/>
</xsl:template>
%%
Где ##attr## это ##id##, ##url## и т.д.
Шаблон ##lego:attribute-if-content## создает атрибут с заданным именем ##name##, если ##content## не является пустой строкой.

Таким образом, по-дефолту атрибут создается только если в xml есть соответствующий атрибут.
Или же переопределен шаблон по моде ##lego:attr-content## и он возвращает непустую строку.

===Список стандартно работающих атрибутов
  * ##lego:id##
  * ##lego:url## -- выводит атрибут ##href##, а не ##url##.
  * ##lego:onclick##
  * ##lego:method##
  * ##lego:action##
  * ##lego:onsubmit##
  * ##lego:name##
  * ##lego:value##
  * ##lego:src##
  * ##lego:type##
  * ##lego:name##
  * ##lego:value##
  * ##lego:tabindex##

===Нестандартные атрибуты

====lego:auto-id
Отличается от ##lego:id## тем, что всегда генерит атрибут ##id## -- либо как и обычный ##lego:id##, или же при помощи функции ##generate-id()##.

====lego:block-class
##lego:block-class## работает также, как и стандартные атрибуты, за одним исключением. Если у xml-элемента есть //модификаторы// -- т.е. атрибуты в неймспейсе ##lego:##, то выводится класс с именем, совпадающим с именем компонента, плюс для каждого модификатора выводится дополнительный класс-модификатор.

Например, если на этот xml-элемент заматчиться с ##mode="lego:block-class"##:
%%(html)
<lego:b-hmenu class="my-class" lego:type="double"/>
%%
то на выходе получим:
%%(html)
<table class="my-class b-hmenu b-hmenu_double">
%%
Здесь класс ##b-hmenu_double## выводится потому, что присутствует атрибут-модификатор ##lego:type## са значением ##double##, ##b-hmenu## -- название компонента, выводится при наличии хотя бы одного модификатора. А ##my-class## берется из xml-атрибута ##class##.

**Важно!** Вся html-верстка очень сильно завязана на правильное использование классов. Поэтому переопределять шаблоны с ##lego:block-class-content## следует с большой осторожностью. Правильнее всего делать это вот так:
%%(html)
<xsl:template match="lego:element" mode="lego:block-class-content">
    <xsl:apply-imports/>
    <xsl:text> my-additional-class</xsl:text>
</xsl:template>
%%

====lego:counter
Генерирует "шапочный" счетчик к ссылке в виде обработчика ##onmousedown="Lego.ch('...')"##. Вместо ##...## передается ##id## счетчика.
Пример использования:
%%(html)
<xsl:template match="lego:b-head-userinfo">
    ...
    <a>
        <xsl:apply-templates select="." mode="lego:counter"/>
        <xsl:apply-templates select="." mode="lego:url"/>
        ...
</xsl:template>

<xsl:template match="lego:b-head-userinfo" mode="lego:counter-content">
    <xsl:value-of select="$lego:id"/><xsl:text>.login.enter</xsl:text>
</xsl:template>
%%
**Внимание!** Эти счетчики используются только для подсчета кликов в шапке. Поэтому не следует использовать их где-либо еще.



===Шоткаты
Есть несколько шоткатов для частоупотребимых групп атрибутов

====lego:attributes
Шоткат для ##lego:id## и ##lego:class##:
%%(html)
<xsl:template match="lego:*" mode="lego:attributes">
    <xsl:apply-templates select="." mode="lego:id"/>
    <xsl:apply-templates select="." mode="lego:class"/>
</xsl:template>
%%

====lego:form-attributes
Шоткат для ##lego:action##, ##lego:method## и ##lego:onsubmit##:
%%(html)
<xsl:template match="lego:*" mode="lego:form-attributes">
    <xsl:apply-templates select="." mode="lego:action"/>
    <xsl:apply-templates select="." mode="lego:method"/>
    <xsl:apply-templates select="." mode="lego:onsubmit"/>
</xsl:template>
%%

====lego:input-attributes
Шоткат для ##lego:name## и ##lego:value##:
%%(html)
<xsl:template match="lego:*" mode="lego:input-attributes">
    <xsl:apply-templates select="." mode="lego:type"/>
    <xsl:apply-templates select="." mode="lego:name"/>
    <xsl:apply-templates select="." mode="lego:value"/>
    <xsl:apply-templates select="." mode="lego:tabindex"/>
</xsl:template>
%%

====lego:input-attributes
Шоткат для ##lego:block-class##:
%%(html)
<xsl:template match="*" mode="lego:block-attributes">
    <xsl:apply-templates select="." mode="lego:block-class"/>
</xsl:template>
%%