2012-09-21 78 views
2

我想用XPath檢索兩個節點中較長的一個。XPath中較長的節點

例如,如果我的XML是

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

我做document.SelectSingleNode(你這裏的XPath)

我希望找回URL1節點。如果url2更長,或者沒有url1節點,我希望得到url2節點。

似乎很簡單,但我很難搞清楚。有任何想法嗎?

+0

網址的最大數量可能是什麼? – choroba

+0

爲了這個例子的目的,我們假設不超過兩個。將有三種可能的情況之一:url1但不是url2,在這種情況下url1應該被返回; url2但不是url1,在這種情況下,應該返回url2;或兩者兼而有之,在這種情況下,贏得的時間越長。 – agoldencom

+0

我想我應該補充一點:我使用.NET,這意味着它需要XPath 1.0 – agoldencom

回答

1

這適用於我,但它很醜。你不能在XPath之外進行比較嗎?

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

我喜歡這裏的創意: )這對我上面的簡化用例起作用。不過,我仍然想知道,是否有任何方法可以使這兩個節點相互靠近或不相鄰。 – agoldencom

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!

+0

原諒我的無知......我需要將它轉換爲xpath查詢,以便與.NET的SelectNodes方法一起運行。我將如何做到這一點與您提出的解決方案 – agoldencom

+0

對不起,我錯過了這是一個XPath而不是XSLT問題。在XPath 2.0中很容易,但是如果你遇到XPath 1.0,那麼花上我的星期天早上不是一種有趣的方式。 –

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>