Работа с вложенными предикатами XPath … усовершенствованный

Писали ли CocoaPods какие-либо предупреждения из-за установки модулей? Я исправил подобную проблему, установив OTHER_LDFLAGS настройки сборки на $(inherited) .

8
задан Frank 9 June 2009 в 01:59
поделиться

4 ответа

Как правило, вам следует избегать использования // там, где это возможно. Я бы подумал о перефразировании:

//object[../properties/@refObjectId=@objectId]

В предоставленном выражении ваш вложенный предикат фактически проверяет

//properties/@refObjectId=//properties/@objectId 

, из которых нет ни одного.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Поскольку вопрос был обновлен здесь это обновленный ответ: Вы добавили: «Кажется, что @objectId во вложенном предикате не относится к атрибуту objectId узла объекта». Ты совершенно прав! Так что давайте исправим !!

//object[../properties[not(@refPropertyId)]/@refObjectId=@objectId]

Это должно быть ближе к тому, что вам нужно!

7
ответ дан 5 December 2019 в 21:21
поделиться

Попробуйте следующее:

   //objects[object/@objectId = properties/@refObjectId]/object
0
ответ дан 5 December 2019 в 21:21
поделиться

Предполагая, что все узлы, принадлежащие данному <объекту> , на самом деле следуют этому объекту (введенные вами похоже, это подразумевает), вы могли бы сделать:

/objects/properties[
  @refObjectId = preceding-sibling::object[1]/@objectId
  and 
  not(@refPropertyId)
]/preceding-sibling::object[1]

Это должно работать очень хорошо.

Если вы работаете в XSLT, все становится намного проще:

<xsl:key name="kPropertiesByObjectId" match="properties" use="@refObjectId" />

и

<xsl:template match="object">
  <!-- This tests for an empty node-set. Non-empty node sets can only happen
       for objects with at least one <properties> node without @refPropertyId -->
  <xsl:if test="key('kPropertiesByObjectId', @objectId)[not(@refPropertyId)]">
    <xsl:copy-of select="." />
  </xsl:if>
</xsl:template>

В случае XSLT порядок узлов объекта и свойств становится неактуальным.

0
ответ дан 5 December 2019 в 21:21
поделиться

Это должно сработать:

//objects/object[@objectId = ../properties/@refObjectId]

Я не уверен, каков ваш xml. Однако, если он имеет следующий формат:

<objects>
    <object objectId="1111" />
    <properties refObjectId="1111" />
    <object objectId="2111" />
    <properties refObjectId="3111" />
    <object objectId="4111" />
    <properties refObjectId="5111" />
    <object objectId="6111" />
    <properties refObjectId="4111" />
    <object objectId="7111" />
    <properties refObjectId="7111" />
</objects>

Тогда вы должны использовать следующий xpath для получения только объектов 1111 и 7111. Результат не должен включать 4111, потому что свойства, где refObjectId = 4111, не следует сразу за объектом, у которого objectId = 4111.

//objects/properties[@refObjectId = preceding::object[1]/@objectId]/preceding::object[1]
0
ответ дан 5 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: