XPath и несколько условий - PullRequest
0 голосов
/ 15 июня 2011

Моя проблема в том, что мое правило XPATH не работает правильно. Я хочу, чтобы он выбрал все XML, где атрибут элемента DataFile Filename не является "thing.xml". Я также добавил образцы XML для облегчения понимания.

Это мое правило XPATH:

/document[transport/sender[code='12345678'] and metaxml/LetterMetaData[Type='invoice'] and SignedDoc/DataFile[@Filename!='thing.xml']]

Вот XML, который я хочу, чтобы мое правило XPATH игнорировало :

<document>
  <transport>
    <sender>
      <code>12345678</code>
    </sender>
  </transport>
  <metaxml>
    <LetterMetaData>
      <Type>invoice</Type>
    </LetterMetaData>
  </metaxml>
  <SignedDoc>
    <DataFile Filename="thing.xml">...</DataFile>
  </SignedDoc>
</document>

Вот XML, который я хочу, чтобы мое правило XPATH не игнорировалось :

<document>
  <transport>
    <sender>
      <code>12345678</code>
    </sender>
  </transport>
  <metaxml>
    <LetterMetaData>
      <Type>invoice</Type>
    </LetterMetaData>
  </metaxml>
  <SignedDoc>
    <DataFile Filename="file_with_other_name_than_thing.xml">...</DataFile>
  </SignedDoc>
</document>

1 Ответ

0 голосов
/ 15 июня 2011

Какой дочерний узел корневого узла (/)? Если ваш документ правильно сформирован, он не должен быть document, а ваш XPath оценивается ничем. Например, следующий XPath:

 /docs/document[SignedDoc/DataFile[not(@Filename!='thing.xml')]]

применяется к этому входу:

<docs>
    <document>
        <transport>
            <sender>
                <code>12345678</code>
            </sender>
        </transport>
        <metaxml>
            <LetterMetaData>
                <Type>invoice</Type>
            </LetterMetaData>
        </metaxml>
        <SignedDoc>
            <DataFile Filename="thing.xml">...</DataFile>
        </SignedDoc>
    </document>
    <document>
        <transport>
            <sender>
                <code>12345678</code>
            </sender>
        </transport>
        <metaxml>
            <LetterMetaData>
                <Type>invoice</Type>
            </LetterMetaData>
        </metaxml>
        <SignedDoc>
            <DataFile Filename="file_with_other_name_than_thing.xml">...</DataFile>
        </SignedDoc>
    </document>
</docs>

возвращает только второй узел документа. Обратите внимание, что дочерний элемент root - docs.

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

 //document[SignedDoc/DataFile[not(@Filename!='thing.xml')]]
...