Je voudrais utiliser la liste détaillée des pauses au lieu dur, voir l'exemple:comptage des noeuds précédents renvoie des résultats inattendus
<para>line1<?linebreak?>
line2<?linebreak?>
line3</para>
Cependant, je ressentais un comportement bizarre dans mon modèle récursif qui empêche le traitement de la deuxième ligne correctement. J'ai créé un cas de test simplifié - pas plus récursif. Si l'expression count(preceding::processing-instruction('linebreak')) = 0
est utilisée de cette façon, rien n'est renvoyé, mais je m'attendrais à la deuxième ligne.
<line>line1</line><node>
line2<?linebreak?>
line3</node>
line2
Cet élément est <node>
pour le débogage ici. Cela confirme que je traite les données attendues.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="para[processing-instruction('linebreak')]">
<xsl:call-template name="getLine">
<xsl:with-param name="node" select="./node()"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="getLine">
<xsl:param name="node"/>
<line>
<xsl:copy-of
select="$node/self::processing-instruction('linebreak')[not(preceding::processing-instruction('linebreak'))]/preceding::node()"
/>
</line>
<xsl:call-template name="getSecondLine">
<xsl:with-param name="node"
select="$node/self::processing-instruction('linebreak')[not(preceding::processing-instruction('linebreak'))]/following::node()"
/>
</xsl:call-template>
</xsl:template>
<xsl:template name="getSecondLine">
<xsl:param name="node"/>
<node>
<xsl:copy-of select="$node"/>
</node>
<xsl:copy-of
select="$node/self::processing-instruction('linebreak')[count(preceding::processing-instruction('linebreak')) = 0]/preceding::node()"
/>
</xsl:template>
</xsl:stylesheet>
Testé dans Saxon HE/EE 9.6.0.7 (dans Oxygen XML Editor 18).
Indépendamment de votre code XSLT actuel, veuillez fournir la sortie de référence que vous attendez pour votre échantillon d'entrée. – Tomalak
Alors qu'est-ce que vous voulez accomplir? Dans le monde XSLT/XPath 2.0, je considérerais une liste détaillée comme étant simplement une séquence de valeurs, par ex. '('line1', 'line2', 'line3')'.Voulez-vous transformer cet échantillon d'entrée en une séquence de chaînes ou peut-être une séquence d'éléments 'line'? Pourquoi ce paragraphe contient-il des instructions de traitement pour indiquer un saut de ligne ainsi que des sauts de ligne dans le texte? Peut-il y avoir quelque chose de plus complexe que des nœuds de texte en clair et des instructions de traitement '' à l'intérieur d'un élément' para'? –
@MartinHonnen Les lignes sont un contenu mixte, pas un texte brut. J'essaie de copier tous les nœuds avant PI et de passer le reste des nœuds à l'itération suivante. Cependant, ce 'repos' se comporte différemment de la première itération. –