5

このクエリを使用する前に、XPathを使用して整数ID値が最大のノードを選択しました。

//somenode[not(@id <= preceding::somenode/@id) and not(@id <= following::somenode/@id)]

私は次のようなことができることを望んでいました:

//entry[not(string-length(child::text()) <= string-length(preceding::entry/child::text())) and not(string-length(child::text()) <= string-length(following::entry/child::text()))]

ただし、1つではなく多数のノードを返します。

サンプルXML:

<xml>
  <entry>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</entry>
  <entry>Nam dignissim mi a massa mattis rutrum eu eget mauris.</entry>
  <entry>Ut at diam a sem scelerisque pretium nec pulvinar purus.</entry>
  <entry>Nunc in nisi nec dolor accumsan suscipit vel a quam.</entry>
  <entry>Nunc suscipit lobortis arcu, nec adipiscing libero bibendum nec.</entry>
  <entry>Aenean eget ipsum et nunc eleifend scelerisque.</entry>
  <entry>In eu magna et diam volutpat molestie.</entry>
  <entry>In volutpat luctus mi, eu laoreet orci dictum vel.</entry>
  <entry>In mattis mi nec magna sodales eu bibendum felis aliquet.</entry>
<!-- etc for 800 more lines or so -->
  <entry>Duis auctor felis id neque gravida ut auctor ipsum ullamcorper.</entry>
  <entry>Sed vel tortor mauris, et aliquet tellus.</entry>
</xml>

XPathテスト:http ://chris.photobooks.com/xml/default.htm?state = 1o

4

1 に答える 1

2

XPath 1.0では、選択したすべてのノードに関数を適用することはできないため、必要な要素を単一のXPath 1.0式で選択することはできませんstring-length(someNodeSet)(このノードセットの最初のノードにのみ適用されます)。もう1つの理由は、XPath 1.0では、範囲変数に名前を付けて参照することができないことです。

XPath 2.0では、これは簡単です。

/*/entry[not(string-length(.) &lt; /*/entry/string-length(.))]

上記entryは、文字列値が最大値である長さのすべての要素を選択します。

/*/entry[not(string-length(.) &lt; /*/entry/string-length(.))] [1]

上記は、最初の(ドキュメント順で)そのようなentry要素を選択します。

XSLT 2.0ベースの検証

この変換:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="/">
  <xsl:sequence select=
   "/*/entry[not(string-length(.) &lt; /*/entry/string-length(.))]"/>
 </xsl:template>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合

<xml>
  <entry>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</entry>
  <entry>Nam dignissim mi a massa mattis rutrum eu eget mauris.</entry>
  <entry>Ut at diam a sem scelerisque pretium nec pulvinar purus.</entry>
  <entry>Nunc in nisi nec dolor accumsan suscipit vel a quam.</entry>
  <entry>Nunc suscipit lobortis arcu, nec adipiscing libero bibendum nec.</entry>
  <entry>Aenean eget ipsum et nunc eleifend scelerisque.</entry>
  <entry>In eu magna et diam volutpat molestie.</entry>
  <entry>In volutpat luctus mi, eu laoreet orci dictum vel.</entry>
  <entry>In mattis mi nec magna sodales eu bibendum felis aliquet.</entry>
<!-- etc for 800 more lines or so -->
  <entry>Duis auctor felis id neque gravida ut auctor ipsum ullamcorper.</entry>
  <entry>Sed vel tortor mauris, et aliquet tellus.</entry>
</xml>

entry文字列の長さが最大の要素(この場合は1つのみ)を選択し、選択した要素を出力します。

<entry>Nunc suscipit lobortis arcu, nec adipiscing libero bibendum nec.</entry>
于 2011-10-28T04:04:02.187 に答える