Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: XSLT: использование значения атрибута в качестве имени параметра.  (Прочитано 12958 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« : 14-04-2010 07:53 » 

Продолжаю штурмовать XSL.

Дано:
Код:
<test>
  <user>
    User name: <placeholder type="name" />
    User age: <placeholder type="age" />
  </user>
</test>

Нужно получить такое:

Код:
    User name: Вася
    User age: 32

Данные получаются из параметров:

Код:
  <xsl:param name="name" select="'Вася'" />
  <xsl:param name="age" select="'32'" />

Сейчас я использую такой шаблон:
Код:
<xsl:template match="placeholder[@type]">
    <xsl:choose>
      <xsl:when test="@type='name'">
        <xsl:value-of select="$name"/>
      </xsl:when>
      <xsl:when test="@type='age'">
        <xsl:value-of select="$age"/>
      </xsl:when>
    </xsl:choose>
  </xsl:template>

А хочется:
Код:

  <xsl:template match="placeholder[@type]">
    <xsl:value-of select="$@type"/>
  </xsl:template>

Но комбинацию $@ XSLT-процессор не разрешает. Жаль Может есть какие другие способы записи?
« Последнее редактирование: 14-04-2010 09:34 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-04-2010 08:00 » 

а так
Код:
<test>
  <user>
    <placeholder type="name">User name</placeholder>
    <placeholder type="age" >User age</placeholder>
  </user>
</test>
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 14-04-2010 09:32 » 

Эммм...

Слав, я наверное слишком узко мысли излагаю (мне-то проблема ясна как божий день). Первое сообщение дополнил.

В первом коде приведены исходные данные. Из них, с помощью XSL, я должен из них получить такое:

Код:
   User name: Вася
    User age: 32

Т.е. значения берутся из параметров XSL с именами name и age. Сейчас я использую такой шаблон:

Код:
<xsl:template match="placeholder[@type]">
    <xsl:choose>
      <xsl:when test="@type='name'">
        <xsl:value-of select="$name"/>
      </xsl:when>
      <xsl:when test="@type='age'">
        <xsl:value-of select="$age"/>
      </xsl:when>
    </xsl:choose>
  </xsl:template>

Т.е. тупо перебираю возможные значения аттрибута type и вывожу значение соответствующего параметра.
Но ведь совершенно очевидно, что значение аттрибута type и есть имя параметра. По идее обращение к параметру с именем name внутри XSL выглядит так: $name, а получение значения аттрибута @type. Поэтому напрашивается совмещение синтаксиса:

$@type

Но процессор XSLT ругается на такую конструкцию. Жаль
« Последнее редактирование: 14-04-2010 09:35 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 14-04-2010 09:44 » 

А так религия исходные данные не позволяют?
Код:
<test>
  <user>
    <name>Вася</name>
    <age>25</age>
  </user>
</test>

Или же,
Код:
<test>
  <user name="Вася" age="25" />
</test>
и запись короче получилась
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 14-04-2010 09:53 » 

Не, Слав. Смотри есть XML исходники. В них стоит куча текста, но есть переменные - это имя и возраст пользователя (на самом деле их гораздо больше и они гораздо разнообразней, это только для примера). Причём они стоят в разных местах.
Например:

Цитата
<paragraph>

      У меня есть друг, его зовут <placeholder type="name" />. Ему <placeholder type="age" /> лет.

      Пхжлдофхпзш хдлфруапх <placeholder type="name" /> щш фткпщшгр фхдлпт эдшфрыва рпэдло эдфвалр хщшфав ыэвапо э хызвапо эшг ываэр жщгыф варэдл.

      Пыдвларо хщы эдлывар щшывап дывшарпхщш ыфваъзщцук <placeholder type="name" /> ывхапшг=з цуткрхзшщг ыварщхшр <placeholder type="age" /> ывардлр зщшрыфук.

      Ффвжд ждлфоыва хдло хзфышщвоа щл фжпдл дло жж.

</paragraph>

Значения имени и возраста определяются программой (вводят, получают из БД и тп). Задача: в нужные места поставить нужные значения. Замена осуществляется с помощью шаблонов XSLT. Вот и всё.
« Последнее редактирование: 14-04-2010 10:00 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 14-04-2010 09:58 » 

Те, собственно говоря, к чему это я. По первой схеме, каждый раз, как только мне понадобится новый placeholder (для размеров окна, названия улицы и тп), мне надо будет расширять шаблон с choose. Ооочень неспортивно. Ведь вся инфа (имя необходимого параметра) уже присутствует.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 14-04-2010 21:03 » 

Жень, посмотри XQuery - можно ли его как-то использовать. Трудно понять их текст, но возможно это то, что надо:
http://www.w3.org/TR/2007/REC-xpath-functions-20070123/#func-resolve-QName


Запись @ATTR является синонимом для attribute(ATTR). Нельзя ли сделать так: attribute($param)
« Последнее редактирование: 14-04-2010 21:24 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 15-04-2010 06:45 » 

Запись @ATTR является синонимом для attribute(ATTR). Нельзя ли сделать так: attribute($param)

attribute()  Не понял  У меня ругается.
>> The variable or parameter 'attribute' is either not defined or it is out of scope.

Может ты имел ввиду attribute::ATTR = @ATTR?

Но всё-равно, мне надо наоборот -> $attribute::ATTR

те обратится к параметру, имя которого получается из аттрибута. К сожалению тоже не прокатило:

>> error: Expected token '<name>', found 'attribute::'.

Те он хочет имя, а раскрывать @ATTR не хочет. Жаль

XQuery посмотрю обязательно. Для меня сейчас любая инфа "в масть". Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 15-04-2010 13:42 » 

В XPath я ничего не нашел по твоему делу. Прежде всего параметры используются для управления остальным, а не наоборот. Вот и глянул в XQuery, но понятия не имею, как и где его можно применять.

Примеры с переменными переменными, все сводятся к choose внутри переменной.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 15-04-2010 14:15 » new

Так и делаю... Жаль
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines