xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Вопросик по XSL


Автор Сообщение
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 (пришлось Анинсталить)...


Скорее всего оштбка в логике передачи параметров, или же в софте который обрабатывает эти файлы Sad