1

我的示例 XML 如下:

<FileList>
  <File>
    <Name>20120427_1.pdf</Name>
    <Size>654441</Size>
    <Property>
      <Name>Country</Name>
      <Value>United States</Value>
    </Property>
   </File>
   <File>
    <Name>Name2</Name>
    <Size>2147483647</Size>
    <Property>
      <Name>Name4</Name>
      <Value>Value4</Value>
    </Property>
    <Property>
      <Name>Name5</Name>
      <Value>Value5</Value>
    </Property>
    <Property>
      <Name>Name6</Name>
      <Value>Value6</Value>
    </Property>
  </File>
  <File>
    <Name>Name3</Name>
    <Size>2147483647</Size>
    <Property>
      <Name>Name7</Name>
      <Value>Value7</Value>
    </Property>
    <Property>
      <Name>Name8</Name>
      <Value>Value8</Value>
    </Property>
    <Property>
      <Name>Country</Name>
      <Value>UK</Value>
    </Property>
  </File>
</FileList>

要求是每个文件节点在 Propery/Name 元素中都有一个 Country 值。到目前为止,我已经创建了一个 XPath 查询:

/FileList/File/Property/Name/text()='Country'

当答案应该为假时,这会传递为真,因为查询正在查看所有节点。如何更改它以便它检查每个“文件”节点?

4

2 回答 2

1

使用

not(/*/File[not(Property/Name = 'Country')])

基于 XSLT 的验证:

这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy-of select=
     "not(/*/File[not(Property/Name = 'Country')])"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<FileList>
  <File>
    <Name>20120427_1.pdf</Name>
    <Size>654441</Size>
    <Property>
      <Name>Country</Name>
      <Value>United States</Value>
    </Property>
   </File>
   <File>
    <Name>Name2</Name>
    <Size>2147483647</Size>
    <Property>
      <Name>Name4</Name>
      <Value>Value4</Value>
    </Property>
    <Property>
      <Name>Name5</Name>
      <Value>Value5</Value>
    </Property>
    <Property>
      <Name>Name6</Name>
      <Value>Value6</Value>
    </Property>
  </File>
  <File>
    <Name>Name3</Name>
    <Size>2147483647</Size>
    <Property>
      <Name>Name7</Name>
      <Value>Value7</Value>
    </Property>
    <Property>
      <Name>Name8</Name>
      <Value>Value8</Value>
    </Property>
    <Property>
      <Name>Country</Name>
      <Value>UK</Value>
    </Property>
  </File>
</FileList>

计算 XPath 表达式并产生所需的正确结果:

false

说明

使用双重否定法

于 2012-11-07T13:49:48.457 回答
0

要获取没有国家/地区的文件,请使用

/FileList/File[not(Property[Name='Country'])]

要仅获取其名称,您可以使用

/FileList/File[not(Property[Name='Country'])]/Name/text()
于 2012-11-07T12:04:55.153 回答