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>

要件は、すべてのファイル ノードの Property/Name 要素に Country 値があることです。これまでのところ、XPath クエリを作成しました。

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

これは、答えが false であるべきときに、クエリがすべてのノードを調べているため、true として渡されます。代わりに各「ファイル」ノードをチェックするように変更するにはどうすればよいですか?

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 に答える