двухпроходная трансформация...

chameleon

Новичок
двухпроходная трансформация...

на первом этапе трансформации получаю переменную $tree как фрагмент дерева с отсортированными как мне нужно элементами..
каким образом можно направить на выход только определенные по условию элементы из $tree ?
 

PhpDeveloper

Guest
Посмотрев тему этого сообщения,
я подумал, что это из области электротехники
:)
 

[DAN]

Старожил PHPClub
На какой выход ?
Опиши задачу поподробнее, а то не понятно, что ты хочешь с этим $tree делать.
 

chameleon

Новичок
;)...вот ведь.
древовидное меню из базы
есть xml:
Код:
<?xml version="1.0" ?>
<root>
  <item id="7" parent="0">пункт1</item>
  <item id="2" parent="7">пункт2</item>
  <item id="5" parent="1">пункт3</item>
  <item id="3" parent="5">пункт4</item>
  <item id="4" parent="0">пункт5</item>
  <item id="6" parent="1">пункт6</item>
  <item id="1" parent="0">пункт7</item>
</root>
1 этап:
есть xsl формирующий такой выход:
Код:
<?xml version="1.0" ?>
<root>
  <item id="7">пункт1
    <item id="2">пункт2</item>
  </item>
  <item id="4">пункт5</item>
  <item id="1">пункт7
    <item id="5">пункт3
      <item id="3">пункт4</item>
    </item>
    <item id="6">пункт6</item>
  </item>
</root>
вобщем, дерево формируется...

2 этап:
далее задача такая: копировать в результат только те элементы верхнего уровня (т.е. "пункт1","пункт5" и "пункт7"), в потомках у которых есть елементы в значении которых есть, к примеру цифра "3", т.е. будет:
Код:
<?xml version="1.0" ?>
<root>
  <item id="1">пункт7
    <item id="5">пункт3
      <item id="3">пункт4</item>
    </item>
    <item id="6">пункт6</item>
  </item>
</root>
на данный момент в голову приходит только применить два xslt поочереди...
ежели пытаюсь создать переменную (вот она $tree :)...и запихать туда результат 1го этапа, то ведь дальше нельзя написать:
<xsl:copy-of select="$tree/item[contains(descendant-or-self::*,'3')]"/>
вот и вопрос: делается это как-либо в php (по типу msxml:node-set($tree) или других расширений) или нет?
 

[DAN]

Старожил PHPClub
А как хочешь.
Можешь 2 преобразования сделать, можешь загнать свой tree в dom-документ, проXPathить его, собрать всё в новое дерево и наложить окончательно таблицу стилей.
С точки зрения удобства мне 1-й вариант (2 xslt) по душе.

Hint: если напрячь мозги, то всё можно в одном xslt сделать ,)
Дерзай, я думать седня уже не хочу )))
 

chameleon

Новичок
Hint: если напрячь мозги, то всё можно в одном xslt сделать ,)
..это не hint!, что напрячь мозги, чтобы что-нибудь сделать это я и так знал :).. подкинь идейку на свежую голову :)... вообще оставлю все как есть, но ради развития интересно сделать и в одном xslt.
 

IchPokhudezh

Guest
<xsl:template match="root">
<root>
<xsl:for-each select="item[ @parent='0']">
<xsl:if test="contains( string( /*/item [ @parent = current()/@id ]), '3')">
<item id="{@id}"><xsl:value-of select="."/>
<xsl:call-template name="menulevel">
<xsl:with-param name="parentid" select="@id"/>
</xsl:call-template>
</item>
</xsl:if>
</xsl:for-each>
</root>
</xsl:template>

<xsl:template name="menulevel">
<xsl:param name="parentid"/>
<xsl:for-each select="/*/item [ string( @parent) = string( $parentid)]">
<item id="{@id}"><xsl:value-of select="."/>
<xsl:call-template name="menulevel">
<xsl:with-param name="parentid" select="@id"/>
</xsl:call-template>
</item>
</xsl:for-each>
</xsl:template>

BTW, как правильно оформить xml текст для форума (дабы хайлайт и пр было?)
 

IchPokhudezh

Guest
Спасибо большое за совет, кстати, а где по этому делу факу/доку найти? :)

Just a test:
PHP:
<?xml version="1.0">
<xsl:template match="docroot">
 <xsl:for-each select="docelem">
   Elem: <xsl:value-of select="."/><br/>
 </xsl:for-each>
</xsl:template>
Так намного лучше (мне, по крайней мере ;-)
 

chameleon

Новичок
точно, только ты пропустил в декларации закрывающий *?* :)... хотя с ним было бы хуже :)...
 
Сверху