2010-09-24 10 views
12

एक्सएमएल स्रोत के साथ तत्व प्राप्त करने के लिए:XPath उच्चतम आईडी

<documents> 
    <document> 
     <id>3</id> 
    </document> 
    <document> 
     <id>7</id> 
    </document> 
    <document> 
     <id>1</id> 
    </document> 
</documents> 

मैं अपने आईडी तत्व (ताकि उदाहरण में <document><id>7</id></document>) में सबसे अधिक मूल्य के साथ दस्तावेज़-तत्व की जरूरत है। मैं सी # कोड नहीं बदल सकता, यह XMLDocument.SelectSingleNode(...) है, मैं केवल इस्तेमाल किए गए XPath को संशोधित कर सकता हूं।

क्या documents/document[id=max(id)] या order by id descending जैसे कुछ ऐसा है?

उत्तर

24
documents/document[not(../document/id > id)] 
+2

+1 कम से कम और सही XPath 1.0 अधिकतम अभिव्यक्ति के लिए, cuadratic जटिलता के अलावा ... –

+0

धन्यवाद, महान समाधान, आपको इसके लिए बोनस अंक प्राप्त करना चाहिए! – Hinek

+2

चालाक समाधान! –

1

इस लिंक पर एक गैंडर है। यह फ़ंक्शन गणित का उपयोग करता है: अधिकतम()।

कि समारोह के लिए स्रोत के लिए एक कड़ी है और बताते हैं कि यह कैसे लागू किया जा सकता

http://www.exslt.org/math/functions/max/index.html

आशा यह आप

+0

और यह लागू करने के बाद आप कुछ इस तरह कर सकते हैं:/दस्तावेज/दस्तावेज़/आईडी [संख्या (बच्चे :: पाठ()) <अधिकतम (संख्या (बच्चे :: पाठ()))] – Restuta

+0

जहां तक जैसा कि मैंने देखा, यह कई एक्सएसएलटी प्रोसेसर द्वारा समर्थित है, लेकिन .NET द्वारा नहीं ... क्या मुझे कुछ याद आ रहा है? – Hinek

+0

@Restuts, मुझे दस्तावेज़ नोड की आवश्यकता है, यह अधिक नहीं होना चाहिए:/दस्तावेज़/दस्तावेज़ [संख्या (आईडी/बच्चा :: टेक्स्ट()) = गणित: अधिकतम (संख्या (आईडी/बच्चा :: टेक्स्ट()))] – Hinek

0

में मदद करता है दुर्भाग्य से, न XPath 1.0 या XPath 2.0 एक तरह से परिभाषित करते हैं() समारोह। हालांकि, अधिकांश कार्यान्वयन एक प्रकार है। उदाहरण के लिए, <xsl:sort> एक्सएसएलटी कार्यान्वयन में उपलब्ध है, और DOM4J का XPath विधि द्वारा एक प्रकार है। मुझे यकीन है कि सी # में कुछ समान है लेकिन आपको सी # कोड थोड़ा बदलना होगा।

2

आप उपयोग कर सकते हैं preceding और following XPath कोई अधिक से अधिक मूल्य नहीं होता है कि क्या जांच करने के लिए अक्ष:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<documents>" 
    + " <document><id>3</id></document>" 
    + " <document><id>7</id></document>" 
    + " <document><id>1</id></document>" 
    + "</documents>"); 

var max = doc.SelectSingleNode(
    "/documents/document[not(id < preceding::document/id) 
         and not(id < following::document/id)]"); 

यदि कई अधिकतम आईडी मूल्यों दस्तावेज़ में उपरोक्त कोड पहले एक वापस आ जाएगी है। आप एक अधिकतम आईडी के साथ पिछले तत्व चाहते हैं तो आप

var max = doc.SelectSingleNode(
    "/documents/document[not(id < preceding::document/id) 
         and not(id <= following::document/id)]"); 

उपयोग कर सकते हैं क्या आप SelectNodes विधि का उपयोग कर सकते हैं एक अधिकतम आईडी होने के सभी तत्वों के साथ एक सूची प्राप्त करना चाहते हैं:

var maxList = doc.SelectNodes(
    "/documents/document[not(id < preceding::document/id) 
         and not(id < following::document/id)]"); 

XSLT संस्करण :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <root> 
     <xsl:value-of 
      select="/documents/document/id[not(. &lt;= preceding::document/id) 
        and not(. &lt;= following::document/id)]"/> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 
+0

क्या यह आपको पहले व्यक्ति को नहीं मिलेगा जो कि पहले से अधिक था और उसके बाद एक था? – jimplode

+0

क्षमा करें, मेरी गलती। – jimplode

11

निक जोन्स XPath 1.0 सही जवाब इसके अलावा, XPath 2.0 में:

/documents/document[id = max(../document/id)]