2010-03-23 4 views
4

Je le modèle xsl suivant:XPath 2.0 requête - comment tester si l'élément courant est le premier élément avec ce nom dans un document xml

<xsl:template match="para"> 
    <fo:block xsl:use-attribute-sets="paragraph.para"> 
     <!-- if first para in document --> 
     <!--<xsl:if test="//para[1] intersect .">--> 
     <xsl:if test="//para[1] intersect ."> 
      <xsl:attribute name="space-after">10pt</xsl:attribute> 
      <xsl:attribute name="background-color">yellow</xsl:attribute> 
     </xsl:if> 
     <xsl:choose> 
      <xsl:when test="preceding-sibling::*[1][self::title]"> 
       <xsl:attribute name="text-indent">0em</xsl:attribute> 
      </xsl:when> 
      <xsl:when test="parent::item"> 
       <xsl:attribute name="text-indent">0em</xsl:attribute> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:attribute name="text-indent">1em</xsl:attribute> 
      </xsl:otherwise> 
     </xsl:choose> 
     <xsl:apply-templates/> 
    </fo:block> 
</xsl:template> 

Le problème que j'ai vérifie que le noeud courant du modèle est le premier noeud para dans le document du code XML suivant:

<document> 
    <section> 
     <paragraph> 
      <para>Para Text 1*#</para> 
      <para>Para Text 2</para> 
     </paragraph> 
    </section> 
    <paragraph> 
     <para>Para Text 3*</para> 
     <para>Para Text 4</para> 
     <para>Para Text 5</para> 
     <sub-paragraph> 
      <para>Para Text 6*</para> 
      <para>Para Text 7</para> 
     </sub-paragraph> 
    </paragraph> 
    <appendix> 
     <paragraph> 
      <para>Para Text 8*</para> 
     </paragraph> 
     <paragraph> 
      <para>Para Text 9</para> 
     </paragraph>   
    </appendix> 
</document> 

XPath J'utilise actuellement est « // para [1] entrecoupent. » qui sélectionne le premier para pour chaque groupe de para (noté avec un * dans l'exemple XML). Des idées sur comment je peux juste sélectionner la première occurrence de para dans le document (indiqué par un #)?

+0

@Mike, Bonne question (+1)! Voir ma réponse pour les expressions recommandées dans XPath 2.0 et XPath 1.0. –

Répondre

6

on peut utiliser Dans XPath 1.0 (XSLT 1.0):

count((//para)[1] | .) = 1 

Cela fonctionne aussi dans XPath 2.0, mais peut ne pas être aussi efficace que l'opérateur intersect.

Je recommanderais le XPath 2.0 suivant l'expression:

(//para)[1] is . 

Prenez note l'utilisation de the XPath 2.0 is operator.

+0

Merci Dimitre, utile de connaître aussi la version xpath 1.0. À la vôtre Mike – Mike

1

Je travaille moi-même la solution, un léger changement est nécessaire dans le XPath ajoutant des crochets autour du para // limite la sélection:

"(// para) [1] recouper." vous pouvez également utiliser "(// para) [1] is." pour obtenir le même résultat, et à cette occasion je crois que la version "est" est plus lisible.

Questions connexes