首页 文章

如何使用XPath选择具有最长子#text节点值的XML节点?

提问于
浏览
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()))]

但它返回一堆节点而不是一个节点 .

示例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

1 回答

  • 2

    The wanted element(s) cannot be selected with a single XPath 1.0 expression ,因为在XPath 1.0中,无法将函数应用于所有选定节点( string-length(someNodeSet) 仅应用于此节点集的第一个节点) . 另一个原因是在XPath 1.0中,无法命名和引用范围变量 .

    In XPath 2.0 this is trivial

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

    以上选择所有 entry 元素,其字符串值的长度为最大值 .

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

    以上选择了第一个(按文档顺序)这样的 entry 元素 .

    XSLT 2.0 - based verification

    这种转变:

    <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>
    

    when applied on the provided XML document

    <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>
    

    selects the entry elements (in this case only one) with the maximum string-length and outputs the selected elements

    <entry>Nunc suscipit lobortis arcu, nec adipiscing libero bibendum nec.</entry>
    

相关问题