2

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

例如,如果我的 XML 是

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

我做 document.SelectSingleNode( your XPath here )

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

看起来很简单,但我很难弄清楚。有任何想法吗?

4

3 回答 3

1

这对我有用,但很难看。不能在 XPath 之外进行比较吗?

record/*[starts-with(name(),'url')
         and string-length(.) > string-length(preceding-sibling::*[1])
         and string-length(.) > string-length(following-sibling::*[1])]/text()
于 2012-09-21T20:02:03.143 回答
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 中使用!

于 2012-09-21T21:42:48.233 回答
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>
于 2012-09-22T02:43:37.493 回答