как от длинных XPath выражений перейти к удобоваримым ?

MoonCat

Старожил PHPCluba
как от длинных XPath выражений перейти к удобоваримым ?

прошлая задача с массивом вроде как разрешилась , двумя вложенными рекурсивными вызовами по колонкам и по строкам массива . Соответственно имеем вызов темплэйта для отображения элемента таблицы с двумя параметрами :
1 номер строки
2 номер колонки

в самом темплайте уж очень "громоздко выходит" описание нужного нам атрибута из тэга ... что то типа :

<xsl:value-of select="./Field[@RowNum=$row][@ColNum=$col]/@Caption"/>

так как нужно много всяких атрибутов выбирать , то это уже напрягает да и наверное скорости не добавляет :(

Как бы отказаться от XPath -овского выражения для для каждого атрибута , а как то например один раз выбрать нужный нам тэг а там уже просто питать @Caption и @aa ....@uu ???

Спасибо :)
 

jian

Guest
<xsl:template match="/">
<xsl:template select="Field"/>
</xsl:template>


<xsl:template match="Field">
<xsl:if test="@RowNum=$row and @ColNum=$col">
<xsl:value-of select="@Caption"/>
</xsl:if>
</xsl:template>

that is to mean - ne nado silno uvlekatsa <xsl:for-each>ami :(

jian
 

MoonCat

Старожил PHPCluba
честно говоря, ничего не понял :(

есть тэги :
<Field RowNum="1" ColNum="1" Caption="aaa1" ... />
<Field RowNum="1" ColNum="2" Caption="aaa2" ... />
<Field RowNum="1" ColNum="3" Caption="aaa3" .... />

<Field RowNum="2" ColNum="1" Caption="bbb1" .../>
<Field RowNum="2" ColNum="2" Caption="bbb2"... />
<Field RowNum="2" ColNum="3" Caption="bbb3"..... />

есть вызов :

<xsl:call-template name="Field">
<xsl:with-param name="col" select="$col" />
<xsl:with-param name="row" select="$row" />
</xsl:call-template>


есть соответственно template:

<xsl:template name="Field">
<xsl:param name="col" />
<xsl:param name="row" />

<xsl:when test="./Field[@RowNum=$row][@ColNum=$col]/@Caption">
...
<xsl:when test="./Field[@RowNum=$row][@ColNum=$col]/@Caption2">
...
<xsl:when test="./Field[@RowNum=$row][@ColNum=$col]/@Caption3">
...
<xsl:when test="./Field[@RowNum=$row][@ColNum=$col]/@Caption4">
.......

как то не красиво выходит ? :(
 

olpa

Новичок
Правильно говорит jian. Не надо увлекаться xsl:for-each.
Код:
...
<x:template match="xxx">
 ...
 <x:apply-templates select = "Field[@RowNum=$row][@ColNum=$col]" />
 ...
</x:template>
...
<x:template  match = "Field">
 ...
 <x:when test="@Caption">...
 <x:when test="@Caption2">...
 ...
</x:template>
...
 

MoonCat

Старожил PHPCluba
спасибо , теперь понятно :)
главное же сам хотел так сделать но что то меня остановило :(

а где вы все усмотрели увлечение xsl:for-each ? :p
 
Сверху