12
votes

XPath pour obtenir l'élément avec l'identifiant le plus élevé

Source XML:

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


0 commentaires

5 Réponses :


1
votes

avoir une gandonnée sur ce lien. Il utilise une fonction mathématique: max ().

Il existe un lien pour la source pour cette fonction et explique comment il peut être mis en œuvre

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

J'espère que cela vous aide


3 commentaires

Et après la mise en œuvre de cela, vous pouvez faire quelque chose comme ceci: / Documents / Document / ID [Numéro (Child :: Text ())


Autant que je sache, il est soutenu par plusieurs processeurs XSLT, mais pas par .NET ... Je manque quelque chose?


@Restuts, j'ai besoin du nœud de document, je ne devrais-t-il pas être plus utile: / Documents / Document [Numéro [Numéro (ID / Child :: Text ()) = Math: max (numéro (numéro / enfant :: texte ())) ]



0
votes

Malheureusement, ni XPath 1.0 ou XPath 2.0 définissent une fonction de tri (). Cependant, la plupart des implémentations ont une sorte. Par exemple, est disponible dans les implémentations XSLT et DOM4J a une sorte de méthode XPath. Je suis sûr qu'il y a quelque chose de similaire dans C #, mais vous devriez changer un peu le code C #.


0 commentaires

2
votes

Vous pouvez utiliser le précédent code> et suivi des axes xpath pour vérifier s'il n'y a pas de valeur supérieure: xxx pré>

s'il y en a plusieurs Valeurs d'identification maximales dans le document Le code ci-dessus renvoie le premier. Si vous voulez le dernier élément avec un ID maximum, vous pouvez utiliser P>

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


1 commentaires

Cela ne vous donnerait-il pas seulement le premier que celui-ci est tombé sur celui qui était plus élevé que celui qui a précédé et celui qui l'après?



29
votes
documents/document[not(../document/id > id)]/id

2 commentaires

+1 Pour une expression maximale XPath 1,0 la plus courte et correcte, outre la complexité quadratique ...


Merci, bonne solution, vous devriez obtenir des points bonus pour celui-ci!



15
votes

En plus de Nick Jones XPath 1.0 Réponse correcte, dans XPath 2.0:

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


0 commentaires