Автор |
Сообщение |
xbor12
Гость
|
[13683]
Чт Мар 26, 2009 18:03
Вопросик по XSL
Пример кода:
Код:
- <fact type="set" name="1">
<fact name="player" type="string" value="B Harrison 1" />
<fact name="team" type="integer" value="Warrington" />
<fact name="type" type="string" value="try" />
</fact>
- <fact type="set" name="2">
<fact name="player" type="string" value="C Hicks 2" />
<fact name="team" type="integer" value="Warrington" />
<fact name="type" type="string" value="penalty" />
В записе player в value имеются цифры: 1, 2, 3 and so on.
как лучше сделать, так что бы этот блок повтарялся столько раз, какая там цифра?
что бы было так:
Код:
- <fact type="set" name="1">
<fact name="player" type="string" value="B Harrison" />
<fact name="team" type="integer" value="Warrington" />
<fact name="type" type="string" value="try" />
</fact>
- <fact type="set" name="2">
<fact name="player" type="string" value="C Hicks" />
<fact name="team" type="integer" value="Warrington" />
<fact name="type" type="string" value="penalty" />
- <fact type="set" name="3">
<fact name="player" type="string" value="C Hicks" />
<fact name="team" type="integer" value="Warrington" />
<fact name="type" type="string" value="penalty" />
На ум приходить вбить эту цифру в переменную и через if писать если переменная = 2 то прописать блок 2 раза и т.д.
но в стулчае, если цифра будет 9 и больше, то набо прописывать много ифов и повторов блоков и будет большой код...
возможно есть более простые варынты/команды.
заранее спасибо!
|
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[13685]
Чт Мар 26, 2009 23:04
http://xmlhack.ru/books/xslt/ch_11_05.html
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
xbor123
Гость
|
[13688]
Пт Мар 27, 2009 14:45
Огромное спасибо!!!
Но вот, возникла небольшая проблеика!!!
Суть проблемы описал внутри кода:
Код:
<xsl:template name="recursive">
<xsl:param name="str"/>
<xsl:param name="s1" select="substring-before(translate($str,'ffff')"/>
<xsl:param name="s2" select="substring-before(substring-after($str,$s1),',')"/>
<xsl:param name="wh" select="5"/>
---------------------------------
Problema
**************
Если я задаю в этот параметр число скажем 5, то шаблон идеально работает и рекурсивно и вайл..
<xsl:param name="wh" select="5"/>
*************
Но мне надо передавать значение этого параметра через сабстринги (вытаскивать с сайта)
я загоняю это значение в параметр s2 и передаю его wh
************
<xsl:param name="wh" select="$s2"/>
************
собственно говоря на этом сразу все виснет и прекращает работу.
---------------------------------
-------------
Telo sablona
-------------
<xsl:if test="$wh !=1">
<xsl:call-template name="recursive">
<xsl:with-param name="wh" select="$wh -1 " />
<xsl:with-param name="str" select="$str"/>
</xsl:call-template>
</xsl:if>
<xsl:variable name="new" select="substring-after($str, ',')" />
<xsl:if test="contains($new, ',')">
<xsl:call-template name="recursive">
<xsl:with-param name="str" select="$new" />
</xsl:call-template>
</xsl:if>
</xsl:template>
Как можно в параметр передать черз сабстринги или другой параметр цифру?
Заранее спасибо!
|
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[13689]
Пт Мар 27, 2009 22:48
xbor123 писал(а): Как можно в параметр передать черз сабстринги или другой параметр цифру?
Именно так, как Вы передаете. Только Вы, в приведеном коде, в шаблон передаете значение только одного параметра.
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
xbor123
Гость
|
[13694]
Пн Мар 30, 2009 10:58
Vasilisk писал(а): xbor123 писал(а): Как можно в параметр передать черз сабстринги или другой параметр цифру?
Именно так, как Вы передаете. Только Вы, в приведеном коде, в шаблон передаете значение только одного параметра.
А мне одно и нужно, предыдущие параметры для того что бы вывести верно значение данного....
п.с.
думал, может что неверно делал, а раз так все должно работать, то видимо в софте какой глюк, или еще какая недосмотренная мелочь
Спасибо
|
xbor123
Гость
|
[13695]
Пн Мар 30, 2009 12:46
Vasilisk писал(а): xbor123 писал(а): Как можно в параметр передать черз сабстринги или другой параметр цифру?
Именно так, как Вы передаете. Только Вы, в приведеном коде, в шаблон передаете значение только одного параметра.
А, понял...
поидее надо так передавать?
Код:
<xsl:if test="$wh !=1">
<xsl:call-template name="recursive">
<xsl:with-param name="str" select="$str"/>
<xsl:with-param name="s1" select="$s1"/>
<xsl:with-param name="s2" select="$s2"/>
<xsl:with-param name="wh" select="$wh -1" />
</xsl:call-template>
</xsl:if>
При таком раскладе тоже вылетает!
|
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[13696]
Пн Мар 30, 2009 21:35
Значения переменных смотрели?
P.S. Поставьте себе Oxygen. В нем есть XSL отладчик
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
Гость
|
[13697]
Вт Мар 31, 2009 10:25
Vasilisk писал(а): Значения переменных смотрели?
P.S. Поставьте себе Oxygen. В нем есть XSL отладчик
Значения переменных проверял, возращают верные цифры.
Возможно ошибка в том что не верно передаю параметры в оба шаблона. Сейчас методом тыка разбираюсь
|
xbor
Новичок
Зарегистрирован: 07.06.2008
Сообщения: 8
|
[13698]
Вт Мар 31, 2009 11:01
Сделал без переменных, сразу в одном параметре прописал сабстринги (возращает верные числа), в случае если число больше 1, то вызывается этот же шаблон с параметром -1, до тех пор пока число не будет равно единицы!
В случае, когда равно 1 то вызывается рекурсивный щаблон, в который передвается параметр WH и STR с меньшими параметрами рекурсии и заного идет проверка на число больше или меньше 1 и.т.д.
Самое интересное, что если в параметр WH - я прописываю любое число вручную, все идельно работает, если прописываю сабстринг возращающий число, тулза которая обрабатывает этот XSL и выдает XML сразу виснет.
Возможно где то есть логическая ошибка (с передачей параметра) получается бесконечный круг, или еще что.
Код:
<xsl:template name="recursive">
<xsl:param name="str"/>
<xsl:param name="wh" select="substring-before(substring-after($str,substring-before(translate($str,'123456789','000000000'),'0')),',')"/>
< BODY >
<xsl:if test="$wh !=1">
<xsl:call-template name="recursive">
<xsl:with-param name="wh" select="$wh -1 " />
<xsl:with-param name="str" select="$str"/>
</xsl:call-template>
</xsl:if>
<xsl:variable name="new" select="substring-after($str, ',')" />
<xsl:if test="contains($new, ',')">
<xsl:call-template name="recursive">
<xsl:with-param name="str" select="$new" />
<xsl:with-param name="wh" select="$wh" />
</xsl:call-template>
</xsl:if>
</xsl:template>
ЧТо бы было понятно обрабатывается такая строка:
P Johnson 2, M King 1, M Monaghan 1, B Harrison 1,
т.е. берется для while ЦИФРА перед запятой и для рекурсии остаток строки после запятой.
рекурсия:
P Johnson 2, M King 1, M Monaghan 1, B Harrison 1,
M King 1, M Monaghan 1, B Harrison 1,
M Monaghan 1, B Harrison 1,
B Harrison 1,
while:
P Johnson P Johnson
M King
M Monaghan
B Harrison
|
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[13701]
Вт Мар 31, 2009 20:37
Давайте минимальный XML и минимальную XSL на которых проявляется ошибка.
P.S. Вы Oxygen конечно же не поставили?
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
xbor
Новичок
Зарегистрирован: 07.06.2008
Сообщения: 8
|
[13702]
Ср Апр 01, 2009 11:08
Часть кода обрабатываемого XHTML
Код:
- <div class="block_inner">
- <p class="score">
- <span class="darkgold">
<strong>Try Scorers:</strong>
</span>
<br />
P Johnson 2, M King 1, M Monaghan 1, B Harrison 1,
</p>
Часть кода обрабатывающего XSL:
Код:
<xsl:template name="games">
<result type="5">
<xsl:for-each select="//div[@class='halfblock'][not(p/b[contains(text(),'squad')])]/div[@class='block_inner']/p">
<xsl:call-template name="recursive">
<xsl:with-param name="str" select="normalize-space(.)"/>
</xsl:call-template>
</xsl:for-each>
</result>
</xsl:template>
<xsl:template name="recursive">
<xsl:param name="str"/>
<xsl:param name="s1" select="substring-before(translate($str,'123456789','000000000'),'0')"/>
<xsl:param name="s2" select="substring-before(substring-after($str,$s1),',')"/>
<xsl:param name="wh" select="$s2"/>
---------------------------------
Переменная s2 приобретвет значение числа перед запятой.
Problema
**************
Если я задаю в этот параметр число скажем 5, то шаблон идеально работает и рекурсивно и вайл..
<xsl:param name="wh" select="5"/>
*************
Но мне надо передавать значение этого параметра через сабстринги (вытаскивать с сайта)
я загоняю это значение в параметр s2 и передаю его wh
************
<xsl:param name="wh" select="$s2"/>
************
собственно говоря на этом сразу все виснет и прекращает работу.
---------------------------------
-------------
Telo sablona
-------------
Выполняется ВАЙЛ пока значение переменной не станет равной 1 в шаблон передаются пaрaметры WH (цифры для вайла) и STR строка для обработки телом шаблона.
----------
<xsl:if test="$wh !=1">
<xsl:call-template name="recursive">
<xsl:with-param name="wh" select="$wh -1 " />
<xsl:with-param name="str" select="$str"/>
</xsl:call-template>
</xsl:if>
выполняется рекурсия строка STR становится короче на одну запятую в швблон передаются все параметры.
-------------------
<xsl:variable name="new" select="substring-after($str, ',')" />
<xsl:if test="contains($new, ',')">
<xsl:call-template name="recursive">
<xsl:with-param name="str" select="$new" />
<xsl:with-param name="s1" select="substring-before(translate($str,'123456789','000000000'),'0')"/>
<xsl:with-param name="s2" select="substring-before(substring-after($str,$s1),',')"/>
<xsl:with-param name="wh" select="$s2"/>
</xsl:call-template>
</xsl:if>
oxygen не установил, как я понял это простой редактор (седня поищу триал, но не думаю что он определит ошибку)
Последний раз редактировалось: xbor (Чт Апр 02, 2009 11:38), всего редактировалось 1 раз
|
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[13705]
Ср Апр 01, 2009 23:45
Это называется минимальный код? Честно говоря, мне банально лень в нем разбираться
Он не определит. Определите Вы.
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
xbor
Новичок
Зарегистрирован: 07.06.2008
Сообщения: 8
|
[13707]
Чт Апр 02, 2009 11:42
Vasilisk писал(а): Это называется минимальный код? Честно говоря, мне банально лень в нем разбираться
Он не определит. Определите Вы.
Sorry...
Поправил пример до минимума...
Поставил OXYGEN, (дебагер мне ошибок не показал) и у него возник конфлик с софтом, который обрабатывает мои XSL i XHTML (пришлось Анинсталить)...
Скорее всего оштбка в логике передачи параметров, или же в софте который обрабатывает эти файлы
|