2010-03-26 4 views
3

Étant donné le schéma ci-dessous - avec un nœud "query" comme contexte, est-il possible avec xpath/xslt de déterminer l'index de ce nœud "query" par rapport à tous les nœuds "query" du document (not à ses frères et soeurs immédiats).xpath/xslt pour déterminer l'index du nœud de contexte par rapport à tous les nœuds du même nom?

TIA,

Geoff

<section> 
    <name>About</name> 
    <link>about</link> 
    <questions> 
     <question> 
      <query>Question 1</query> 
      <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer> 
     </question> 
    </questions> 
</section> 

<section> 
    <name>Contact</name> 
    <link>contact</link> 
    <questions> 
     <question> 
      <query>Question 1</query> 
      <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer> 
     </question> 
     <question> 
      <query>Question 2</query> 
      <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer> 
     </question> 
    </questions> 
</section> 

+0

Bonne question (+1). Il y a une très courte expression XPath à un interligne qui vous donne le résultat désiré - voir ma réponse. :) –

Répondre

7

utilisation:

count(preceding::question)+1 

Cette transformation effectue un test exhaustif:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:variable name="vQs" select="//question"/> 

<xsl:template match="/"> 
    <xsl:for-each select="$vQs"> 
    <xsl:value-of select= 
    "count(preceding::question)+1"/> 
    <xsl:text> </xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Lorsque la transformation ci-dessus est appliquée sur le document XML suivant:

<t> 
    <section> 
     <name>About</name> 
     <link>about</link> 
     <questions> 
      <question> 
       <query>Question 1</query> 
       <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer> 
      </question> 
      <question> 
       <query>Question 2</query> 
       <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer> 
      </question> 
     </questions> 
    </section> 
    <section> 
     <name>Contact</name> 
     <link>contact</link> 
     <questions> 
      <question> 
       <query>Question 3</query> 
       <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer> 
      </question> 
      <question> 
       <query>Question 4</query> 
       <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer> 
      </question> 
      <question> 
       <query>Question 5</query> 
       <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer> 
      </question> 
     </questions> 
    </section> 
</t> 

La demandeuse de résultats sont produits:

1 2 3 4 5 
+0

Nice! Je ne savais pas à ce sujet. Certainement le rend plus facile que ce que j'essayais de faire. – jwismar

+0

@jwismar, Heureux que vous aimez la réponse. Que diriez-vous d'exprimer cela avec un upvote? :) –

+0

Parfait - merci! –

Questions connexes