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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача нескольких параметров из apply-templates, в <xsl:template match="...."> 
:(
    Опции темы
Karabas
Дата 21.7.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может кто сталкивался ? 
Есть template для обработки тега, допустим, вставка рисунка. Он имеет несколько входных параметров и обрабатывает теги в .xml файле. 
Код

<xsl:template match="Pimage">
<img>
<xsl:attribute name="width">
    <xsl:value-of select="@width"/>
</xsl:attribute>
<xsl:attribute name="height">
    <xsl:value-of select="@height"/>
</xsl:attribute>
<xsl:attribute name="src">
    <xsl:value-of select="@filename"/>
</xsl:attribute>
</img>
</xsl:template>


А теперь я хочу добавить рисунки непосредственно в .xsl шаблон, но они должны иметь несколько параметров. Насколько я нашел, можно передавать доп аргумент аттрибутом mode: 
Код

<xsl:apply-templates select="Pimage" mode="xxx"/>

Но это не позволяет передать несколько аргументов, как хотелось бы. 

В идеале холелось бы просто добавлять в XSL файл что-то вроде 
Код

<Pimage width="100" height="80" filename="image.jpg"/>

и в окончательном html файле видеть рисунок, оформленный в соответствии с template "Pimage", как я написал выше.  Иначе приходится вписывать каждый рисунок отдельно, что сильно загромождает код.. 
 
PM MAIL   Вверх
Bikutoru
Дата 27.7.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

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



XML такой
Код

<?xml version="1.0" ?>
<root>
    <photo source="http://www.google.ru/images/hp0.gif" name="Google logo" />
    <photo source="http://ya.ru/logo.gif" name="Yandex logo" />
</root>


С помощью такого XSLT
Код

<?xml version="1.0" encoding="windows-1251" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/root//photo">
    <img>
        <xsl:attribute name="src">
            <xsl:value-of select="./@source" />
        </xsl:attribute>

        <xsl:attribute name="title">
            <xsl:value-of select="./@name" />
        </xsl:attribute>

        <xsl:attribute name="alt">
            <xsl:value-of select="./@name" />
        </xsl:attribute>
    </img>
    <br />
</xsl:template>

</xsl:stylesheet>


преобразуется в это:
Код

<?xml version="1.0"?>
<img src="http://www.google.ru/images/hp0.gif" title="Google logo" alt="Google logo" />
<br />
<img src="http://ya.ru/logo.gif" title="Yandex logo" alt="Yandex logo" />
<br />


Если же все-таки нужно передавать в шаблон значения, то это можно делать с помощью xsl:with-param
Пример (особого смысла не несет, просто демонстрация)
Код

<?xml version="1.0" encoding="windows-1251" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/root">  
    <xsl:apply-templates select="./photo">
        <xsl:with-param name="source" select="12" />
        <xsl:with-param name="name" select="23" />
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="photo">
    <xsl:param name="source" select="./@source" />
    <xsl:param name="name" select="./@name" />
    
    <img>
        <xsl:attribute name="src">
            <xsl:value-of select="$source" />
        </xsl:attribute>

        <xsl:attribute name="title">
            <xsl:value-of select="$name" />
        </xsl:attribute>

        <xsl:attribute name="alt">
            <xsl:value-of select="$name" />
        </xsl:attribute>
    </img>
    <br />
</xsl:template>


</xsl:stylesheet>


Результат преобразования самого того же XML-файла такой:
Код

<?xml version="1.0"?>
<img src="12" title="23" alt="23" />
<br />
<img src="12" title="23" alt="23" />
<br />


Добавлено @ 09:24 
Значение xsl:param следующее: если передается xsl:with-param с таким же именем, то взять его значение, если нет, то взять свое значение... 


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Karabas
Дата 27.7.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, примерно так я и начал делать.. от безвыходности: писать теги картинок в отдельный xml файл и вызывать их из xsl. 
И вы меня утвердили в мысли, что вызов картинки обязан быть извне: вставка рисунка должна быть по сигналу из внешнего (.xml) файла. 

Я думал есть какая-то функция, вроде <xsl:use-template name="photo" /> с нужным набором параметров. 
Тогда я бы мог вставлять картинки, указанные в xml файле для контента, и независимо вставлять картинки, используемые в xsl файле для общего дизайна, при помощи единого темплейта а-ля
Код

<xsl:template match="photo">
..
</xsl:template>


Отдельное спасибо за пояснение и способ применения xsl:with-param, я не дочитал до этого места в спецификации, теперь буду пользоваться. :-) 
 
PM MAIL   Вверх
Exception
Дата 27.7.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если тебе надо, чтобы каждая конструкция photo заменялась на, например, img, просто поставь //:
Код
<xsl:template match="//photo">
  <!-- ... -->
</xsl:template>
Или я не так понял вопрос? 
PM   Вверх
Karabas
Дата 28.7.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть файл .xml, база данных. Там названия файлов, описания, служебная информация и т.п.  Каждой записи присвоен уникальный ID, например id="example1". Все соответствующие tempelates в xsl файле (xml+xsl->html) сделаны и корректно работают. 
После этого, добавление картинки к тексту в .xml файле с контеном сводится просто к тегу 
<photo ref="example1"/>. 

А теперь последний штрих: хочу добавить картинку напрямик в html, без вызова ее из xml с контентом. Ну, например, логотип.  Хотелось максимально просто, тем более уже есть отлаженный <xsl:template match="photo">, 
вызывать этот photo прямо из xsl: 
Код

<xsl:stylesheet>
<xsl:template match="html-out">
<html>
<head></head>
<body>
<xsl:use-template name="photo" ref="logo"> 
(я понимаю, что нет такой команды use-template, но 
смысл ее именно такой: использовать один из темплейтов 
напрямую)
Сначала текст, не зависящий от контента страницы. 

Дальше обработка контента страницы (загружаем из xml файла с контентом): 
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<template match="photo">
тут обработка темплейта photo. 
</xsl:template>
...
</xsl:stylesheet>


Но, как я понял, нет способов оперировать в xsl файле подобным образом. 
 
PM MAIL   Вверх
Bikutoru
Дата 31.7.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

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



Цитата(Karabas @  28.7.2006,  11:04 Найти цитируемый пост)
хочу добавить картинку напрямик в html, без вызова ее из xml с контентом

Может тогда лучше использовать просто 
Код

<img src="..." />

без всяких преобразований и шаблонов?!

Добавлено @ 15:48 
Цитата(Karabas @  28.7.2006,  11:04 Найти цитируемый пост)
(я понимаю, что нет такой команды use-template, но 
смысл ее именно такой: использовать один из темплейтов 
напрямую)

Зато есть именованные шаблоны и xsl:call-template :
Код

<?xml version="1.0" ?>
<root>
  <photo source="22" name="1" />
</root>


Код

<?xml version="1.0" encoding="windows-1251" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/root">  
    <xsl:apply-templates select="./photo">
        <xsl:with-param name="source" select="12" />
        <xsl:with-param name="name" select="23" />
    </xsl:apply-templates>
    
    <xsl:call-template name="showphoto">
        <xsl:with-param name="source">foo</xsl:with-param>
        <xsl:with-param name="name">bar</xsl:with-param>
    </xsl:call-template>
</xsl:template>

<xsl:template match="photo" name="showphoto">
    <xsl:param name="source" select="@source" />
    <xsl:param name="name" select="@name" />
    
    <img>
        <xsl:attribute name="src">
            <xsl:value-of select="$source" />
        </xsl:attribute>
        <xsl:attribute name="title">
            <xsl:value-of select="$name" />
        </xsl:attribute>
        <xsl:attribute name="alt">
            <xsl:value-of select="$name" />
        </xsl:attribute>
    </img>
    <br />
</xsl:template>
</xsl:stylesheet>

и получаем:
Код

<?xml version="1.0"?>
<img src="12" title="23" alt="23" /><br />
<img src="foo" title="bar" alt="bar" /><br />
  

Это сообщение отредактировал(а) Bikutoru - 31.7.2006, 15:49


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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