parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Рекурсивный вызов функций в Parser

Виталий 25.03.2004 19:05

Может кто-нибудь сталкивался с этим:
Кажется парсер после рекурсивного вызова функции не возвращает
управление в предыдущий вызов этой-же функции.
По крайней мере у меня :(
Может я за деревьями не вижу леса ? Поделитесь, пожалуйста, своим
видением этой ситуации.
А задача такая:
нужно из xml-документа выделить все аттрибуты name элемента item,
причем код должен знать, что, например, элемент item с аттрибутом
name="Item 2.2" является родительским относительно элемента item
с аттрибутом name="Item 2.2.1"

Может есть и другой путь как этого добиться?

Я не хочу примеров решения "на халяву" - действительно уперся
в стену !
Спасибо!

Вот код на парсере:


@main[]
$document[^xdoc::load[menu.xml]]

$menu_element[$document.documentElement]
$elements_hash[$menu_element.childNodes]
#^elements_hash._count[]
^for[i](0;$elements_hash-1){
$element[$elements_hash.$i]

^if($element.nodeName ne "#text"){
^if($element.nodeName ne "sub"){
^processItem[$element]
}{
^processSubItem[$element]
}
}
}


@processItem[element]
^element.selectString[string(@name)]


@processSubItem[element]
$sub_hash[$element.childNodes]
^for[z](0;$sub_hash-1){
$sub_element[$sub_hash.$z]
^if($sub_element.nodeName ne "#text"){
^if($sub_element.nodeName ne "sub"){
z: $z ^processItem[$sub_element]
}{
z: $z ^self.processSubItem[$sub_element]
}
}
}





... а вот xml-документ:
<menu>
<item name="Item 1" ref="/"/>
<item name="Item 2" ref="/"/>
<sub>
<item name="Item 2.1" ref="/"/>
<item name="Item 2.2" ref="/"/>
<sub>
<item name="Item 2.2.1" ref="/"/>
<item name="Item 2.2.2" ref="/"/>
<item name="Item 2.2.3" ref="/"/>
</sub>

<item name="Item 2.3" ref="/"/>
</sub>
<item name="Item 3" ref="/"/>
</menu>