XPath和多个条件

时间:2011-06-15 06:00:28

标签: xpath rule

我的问题是我的XPATH规则无法正常工作。我希望它选择DataFile元素属性Filename不是“thing.xml”的所有XML。我还添加了示例XML,以便于理解。

这是我的XPATH规则:

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

这是我想要 XPATH规则忽略的XML:

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

这是我想要的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 :(得分:0)

哪个是根节点(/)的子节点?如果您的文档格式正确,则不应为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')]]