Xpoint
   [напомнить пароль]

выбрать узлы одного уровня вложенности

Метки: [без меток]
2009-11-17 13:52:43 [обр] Gella[досье]

Здравствуйте!
Подскажите, пожалуйста, как можно из исходного дерева XML выбрать узлы, которые:

  1. соответствовали бы некоторому шаблону
  2. находились бы на одном уровне вложнности

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

Спасибо!

спустя 28 минут [обр] Lynn «Кофеман»(52/571)[досье]
Можно подробнее и с примерами?
спустя 48 минут [обр] Gella[досье]

У меня есть некоторое входное дерево в формате XMI (полученное из UML). Упрощенно можно представить часть документа таким образом:

<region>
  <subvertex id="1">
     <incoming />
     <incoming />
     <region>
        <outgoing />
     </region>
  </subvertex>
  <subvertex id="2">
     <incoming />
     <region>
        <subvertex id="21">
           <incoming />
           <incoming />
           <region>
             <outgoing />
          </region>
       </subvertex>
     </region>
  </subvertex>
</region>

Т.е. имеются регионы (region), которые могут содержать в себе:

  1. простые состояния, в которых нет вложенных состояний (такие, как subvertex[@id=1])
  2. гиперсостояния, в которых есть вложенные состояния (такие, как subvertex[@id=2])
  3. других потомком, например исходящие переходы (outgoing)

Патенциально, вложенность состояний может быть какой угодно.

Моя задача:
Найти регионы, включающие в себя гиперсостояния, такие, что эти гиперсостояния содержат только простые состояния, и не содержат в себе других гиперсостояний.

Другими словами:
Мне нужно найти регионы, удовлетворяющие следующим условиям:

  1. Выбранные регионы включают в себя гиперсостояния gs: count(region/subvertex/region/subvertex)>0
  2. Гиперсостояния gs включают в себя только простые состояния
  3. Выбранные регионы находятся на одном уровне вложенности относительно всей модели

Надеюсь, задача стала понятнее...
Спасибо

спустя 5 минут [обр] Gella[досье]
P.S. к предыдущему посту:
  1. сорри за орфографию: *потенциально
  2. акцент задачи на том, что выбранные регионы должны быть на одном уровне вложенности
спустя 4 часа 34 минуты [обр] Gella[досье]

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

  1. Для текущего уровня - проверить всех "братьев" на наличие потомков
  2. Если потомки есть - спуститься на 1 уровень вниз, вернуться к п.1
  3. Если потомков ни у кого из "братьев" нет - то выбранное множество и будет нужным

Осталось только реализовать.. Разумен ли такой подход? Неужели подобная задача неактуальна?..

Спасибо

спустя 4 часа 1 минуту [обр] Александр Лукьянов(221/781)[досье]
Gella[досье]
Не слишком эффективно, но хочется для начала определить, правильно ли я понял задачу?
<xsl:variable name="a" select="//region[subvertex/region/subvertex[not(descendants::subvertex)]]"/>

<xsl:for-each select="$a">
  <xsl:sort select="count(ancestor::*)"/>
  ...
</xsl:for-each>
спустя 12 часов [обр] Gella[досье]
Александр Лукьянов[досье]
Спасибо большое! Похоже на то, что надо. Попробую Ваше решение вечером.
спустя 12 дней [обр] Gella[досье]
Александр Лукьянов[досье]
Спасибо, Вы мне очень помогли!
Powered by POEM™ Engine Copyright © 2002-2005