Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не правильно вызывает call-template 
:(
    Опции темы
4epT
Дата 20.2.2012, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Всем привет. Поставлена задача валидации отчетов с помощью xsl шаблонов. У каждого отчета есть два одинковых тега (head и footer), которые правильно было бы вынести в отдельный xsl ... и что бы при подключении можно было быстро провалеировать head и footer.

Вот так я вызываю шаблоны:

Код

<xsl:template match="*">
        <xsl:call-template name="check_head">
        </xsl:call-template>
        
        <xsl:call-template name="check_body">
        </xsl:call-template>
        
        <xsl:call-template name="check_footer">
        </xsl:call-template>
</xsl:template>


шаблоны check_head и check_footer описаны в отдельном файле main.xsl. Данный файл инклюдится в самом верху.

Код

<xsl:include href="main.xsl"/>


Шаблоны имеют вот такой вид:

Код

<xsl:template name="check_footer" match="/D/BODY/PAGE/FOOTER">
        <xsl:choose>
            <xsl:when test="normalize-space(./NUMIDENT)=''">
                <xsl:call-template name="uk">
                    <xsl:with-param name="node_name" select="'С4007'" />
                </xsl:call-template>
            </xsl:when>
        </xsl:choose>
</xsl:template>


Код

<xsl:template name="check_head" match="/D/HEAD">
....


Проблема в том, что он в любом случае выводит сообщение что поле пустое или не правильно заполнено, даже если там все нормально.

В чем может быть проблема ? Если предоставил недостаточно информации, пишите) покажу что нужно ...
PM MAIL   Вверх
diadiavova
Дата 20.2.2012, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



При вызове именованного шаблона вряд ли выражениен ./NUMIDENT имеет смысл. Ну или во всяком случае, у него совсем не тот контекст, которого ты ждешь. По-моему в данном случае лучше использовать apply-templates с явным указанием атрибута select, или передавай нужный узел шаблону с помощью with-param.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
4epT
Дата 20.2.2012, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата

использовать apply-templates с явным указанием атрибута select


Попробую так сделать ...

А объясни пожалуйста, почему не работает мой вариант ? Я себе представлял call-template в виде функции ... у шаблона которого я вызываю указан полный путь к узлу который я хочу обработать, и относительно этого пути я писал ./NUMIDENT, который в свою очередь я думал "преобразуется" в /D/BODY/PAGE/FOOTER/NUMIDENT
PM MAIL   Вверх
magelan
Дата 20.2.2012, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 7
Всего: 16



не преобразуется.
шаблон вызывается без параметров. нейм и матч указать в шаблоне можно для разных способов вызова.
писать длинные пути в маске шаблонов не рекомендуется.

вам свою задачу надо было решать как-то так:
Код

<xsl:template match="/">
    <!-- обрабатываем корень, если надо построение HTML документа, его делают в этом шаблоне -->
    <xsl:apply-templates select="D" />
</xsl:template>

<xsl:template match="D">
    <!-- обрабатываем документ -->
    <xsl:apply-templates select="BODY/PAGE/HEAD" />
    <xsl:apply-templates select="BODY/PAGE/*[not( name()='HEAD' or name()='FOOTER' )]" />
    <xsl:apply-templates select="BODY/PAGE/FOOTER" />
</xsl:template>

<xsl:template match="HEAD">
    <!-- обрабатываем заголовок -->
</xsl:template>

<xsl:template match="FOOTER">
    <!-- обрабатываем подвал -->
    <xsl:if test="NUMINDENT">
          <!-- ... -->
    </xsl:if>
</xsl:template>

<xsl:template match="*">
    <!-- обрабатываем все что не подвал и заголовок -->
</xsl:template>


Это сообщение отредактировал(а) magelan - 20.2.2012, 13:47
PM MAIL   Вверх
diadiavova
Дата 20.2.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(magelan @  20.2.2012,  14:42 Найти цитируемый пост)
 нейм и матч указать в шаблоне можно для разных способов вызова.

 smile То есть иными словами, работает либо нейм, либо матч, но не оба сразу и если вызываешь по имени, то матч не учитывается.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
4epT
Дата 20.2.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата(diadiavova @ 20.2.2012,  14:29)
Цитата(magelan @  20.2.2012,  14:42 Найти цитируемый пост)
 нейм и матч указать в шаблоне можно для разных способов вызова.

 smile То есть иными словами, работает либо нейм, либо матч, но не оба сразу и если вызываешь по имени, то матч не учитывается.

Так вот оно в чем дело ) А от какого узла работает шаблон при вызове его через name ?
PM MAIL   Вверх
diadiavova
Дата 20.2.2012, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(4epT @  20.2.2012,  16:07 Найти цитируемый пост)
А от какого узла работает шаблон при вызове его через name ? 

Здесь нет контекста, поэтому все выражения считаются от корня документа, то есть к примеру такое выражение ./* возвратит корневой элемент.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0642 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.