2016-04-18 2 views
1

Я пытаюсь выбрать определенные элементы в XML, для которых их предки не имеют определенного значения. Для целей примера давайте этот XML:Выбор элементов без значений у предков с использованием XPath

<doc> 
    <block platform="mobile"> 
     <xref>1</xref> 
    </block> 
    <block platform="desktop"> 
     <xref>2</xref> 
    </block> 
    <block> 
     <xref>3</xref> 
    </block> 
</doc> 

мне нужно что-то, выбирающий все внешние ссылки, которые не имеют «мобильный», как их стоимость платформы сами по себе или любой из их предков. В приведенном выше примере запрос должен возвращать xrefs 2 и 3, так как ни у них, ни у их предков платформа не установлена ​​на «мобильный» (или вообще не имеет платформы).

Я попробовал несколько комбинаций запросов xpath с использованием предков, пытаясь согласовать все значения платформы для предков xref и используя not (contains()), чтобы отфильтровать мобильную часть, но все не повезло.

Заранее спасибо

ответ

1

Вы можете использовать этот XPath:

//xref[not(ancestor-or-self::*/@platform = 'mobile')] 

Это вообще хорошо, чтобы избежать // если вы можете. Если ваш XML всегда будет иметь структуру выше, вы можете вместо этого использовать:

/doc/block/xref[not(ancestor-or-self::*/@platform = 'mobile')] 

Часть между [] с такой же в обоих.

+0

Из того, что я вижу прямо сейчас, это прекрасно решает мои потребности. Я только начал изучать XPath 2 дня назад, поэтому я пытаюсь обвести голову вокруг того, что это делает, но большое спасибо! –

Смежные вопросы