XPath中的节点更长

时间:2012-09-21 19:29:57

标签: xpath

我想使用XPath来检索两个节点中的较长节点。

例如,如果我的XML是

<record>
   <url1>http://www.google.com</url1>
   <url2>http://www.bing.com</url2>
</record>

我做文件.SelectSingleNode(你的XPath在这里

我希望能回到url1节点。如果url2更长,或者没有url1节点,我希望得到url2节点。

看起来很简单,但我无法搞清楚。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这适合我,但它很难看。你不能在XPath之外进行比较吗?

record/*[starts-with(name(),'url')
         and string-length(.) > string-length(preceding-sibling::*[1])
         and string-length(.) > string-length(following-sibling::*[1])]/text()

答案 1 :(得分:0)

<xsl:for-each select="*">
  <xsl:sort select="string-length(.)" data-type="number"/>
  <xsl:if test="position() = last()">
    <xsl:copy-of select="."/>
  </xsl:if>
</xsl:for-each>

甚至适用于XSLT 1.0!

答案 2 :(得分:0)

使用此单个XPath表达式

  /*/*[not(string-length(preceding-sibling::*|following-sibling::*)
          >
          string-length()
          )
       ]

基于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="/">
     <xsl:copy-of select=
     "/*/*[not(string-length(preceding-sibling::*|following-sibling::*)
              >
              string-length()
              )
         ]"/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<record>
    <url1>http://www.google.com</url1>
    <url2>http://www.bing.com</url2>
</record>

评估Xpath表达式并将此评估结果(所选元素)复制到输出

<url1>http://www.google.com</url1>