Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Условие в xsl


Автор: Yakoot 21.3.2012, 14:22
доброго всем времени суток.. появилась срочная задачка поменять шаблон сообщения, а я до этого XSL в глаза не видел.. не могу понять, как сделать условие: если содержимое тега itemtype.intname равно какой-либо строке, то выводить одно, если другой то другое.. подскажите, пожалуйста?

Добавлено через 11 минут и 11 секунд
разобрался.. функция contains() тут нужна)
всем спасибо)

Автор: diadiavova 21.3.2012, 15:52
Вообще для проверки условий используются элементы if и choose. Но в принципе, от задачи зависит.

Автор: Yakoot 23.3.2012, 14:42
а вот еще вопрос: у меня есть два тега addon в корне.. в каждом из них есть name и value.. xsl:if я вроде научился делать... а как сделать цикл, проверяя каждый addon, и если в нем есть name с нужным содержимым, то выводить значение value?

Автор: diadiavova 23.3.2012, 14:51
Цитата(Yakoot @  23.3.2012,  15:42 Найти цитируемый пост)
а как сделать цикл

Никак. В языке их просто нет. Есть for-each, решает подобные проблемы, но то, что ты описал, обычно делается не так. Следует сразу создавать такое выражение XPath, чтобы в набор узлов попадали нужные узлы, а не все подряд. Ну например, ты ищешь элементы addon с именем qwerty,тогда пишешь следующее выражение
Код

addon[name = 'qwerty']
И у тебя туда ничего лишнего не попадет.

Автор: Yakoot 23.3.2012, 15:43
чот я не понял маленько)) странный этот xsl, всё не так.. исходный XML мне не подвластен, он генерится автоматически..
<doc>
... 
  <addon>
    <name>myslots</name>
    <value>10</value>
  </addon>
  <addon>
    <name>myservertype</name>
    <value>public</value>
  </addon>
...
</doc>
вот так выглядит кусок этот
в xsl я составляю текст сообщения, выбираю всякие значения из <xsl:template match='doc'> и в один прекрасный момент мне нужно вставить вот эту циферку 10 и слово public в таком виде: 
Количество слотов: 10
Тип сервера: public

видимо как-то нужно прогонять по очереди эти два addon и искать там совпадения.. 

Автор: diadiavova 23.3.2012, 15:52
Цитата(Yakoot @  23.3.2012,  16:43 Найти цитируемый пост)
видимо как-то нужно прогонять по очереди эти два addon и искать там совпадения..  

Ну вот примерно так
Код

<xsl:template match="doc">
Количество слотов: <xsl:value-of select="addon[name = 'myslots']/value"/>
Тип сервера: <xsl:value-of select="addon[name = 'myservertype']/value"/>
</xsl:template>

Автор: Yakoot 26.3.2012, 10:13
мм.. спасибо, чуть позже попробую)

Автор: Yakoot 26.3.2012, 10:50
всё работает) премного благодарен)

Автор: Yakoot 26.3.2012, 11:47
а вот еще проблемка.. я делаю <xsl:value-of select="substring-after(text, "http://url")"/>
текст выглядит так:
"нужная мне часть
http://url&quot;
получается нужная мне часть возвращается вместе с переводом строки.. пытался в substring-after в "http://url" в начале писать всякие, как мне подсказал гугл, &#10, &#13, &#xA.. но чот толку от этого никакого.. обрезающей функции я тоже не нашел.. конечно можно в коде не переводить <xsl:value-of select... на новую строку, тогда забрав перевод строки в итоговом выводе всё станет как нужно.. но это, как мне кажется, немного кривое решение.. может подскажете чего?

Автор: diadiavova 26.3.2012, 11:58
Цитата(Yakoot @  26.3.2012,  12:47 Найти цитируемый пост)
обрезающей функции я тоже не нашел..

normalize-space удаляет все пробельные символы вначале и в конце строки.
Цитата(Yakoot @  26.3.2012,  12:47 Найти цитируемый пост)
пытался в substring-after в "http://url" в начале писать всякие, как мне подсказал гугл, &#10, &#13, &#xA..

надо писать  &#13 и &#10 подряд. Завершать ессно надо точкой с запятой, здесь не делают, потому что форум сожрать может smile .
Только почему substring-after, когда substring-before ? smile 

Автор: Yakoot 26.3.2012, 12:05
хм.. на автомате написал наверное) там как надо сделано) точки с запятой я ставил, тут забыл просто про них) а насчет того, что надо оба подряд ставить, не знал smile ща попробую

Автор: Yakoot 26.3.2012, 12:28
так.. мне из текста нужно забрать всё что после url без перевода строки после этого самого url...
Код

substring-after(item.welcomemsg, 'http://url&#13т.з.&#10т.з.')

не работает

Автор: diadiavova 26.3.2012, 12:54
Эммммм... а как же это?
Цитата(Yakoot @  26.3.2012,  12:47 Найти цитируемый пост)
"нужная мне часть
http://url&quot;

 smile 
Цитата(Yakoot @  26.3.2012,  13:28 Найти цитируемый пост)
не работает

Вообще-то способ переноса строки может варьироваться и зависит как от системы, так и от приложения, в котором создается документ. Я вот сейчас попробовал для вот такого документа
Код

<?xml version="1.0" encoding="utf-8" ?>
<root>
  текст1
  текст2
  текст3
</root>
выбрать все, что до и после текст2 с учетом перехода строки, сработал только вариант с &#10
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="yes"/>

    <xsl:template match="/">
      <xsl:value-of select="substring-before(root,'&#10  текст2')"/>
      <xsl:value-of select="substring-after(root,'текст2&#10')"/>
      
    </xsl:template>
</xsl:stylesheet>
Так что этот способ не вполне надежен. Используй normalize-space, эта функция как раз для таких случаев и нужна.

Автор: Yakoot 26.3.2012, 13:02
у меня просто в нужной части тоже были переносы строк, normalize-space их убирает.. пришлось сделать выборку отдельно каждой строки посредством комбинации substring-after и substring-before =) надоело уже возиться с этим) пусть так и остаётся) спасибо за всё)
тему пока не закрываю, мож еще какие вопросы возникнут)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)