prochain j'ai le code XML suivant:Appel de modèle nommé pour frères et soeurs
<Text>
<p id="258">Step.</p>
<p id="1123">Step info.</p>
<p id="258">Step.</p>
<p id="1123">Step info.</p>
<p id="258">Step.</p>
<p id="1123">Step info:</p>
<p id="1123">- Comment.</p>
<p id="1123">- Comment.</p>
<p id="1123">- Comment.</p>
</Text>
je dois en faire un DocBook <orderedlist>
:
<orderedlist>
<listitem>
<para>Step.</para>
<para>
<emphasis>Step info.</emphasis>
</para>
</listitem>
<listitem>
<para>Step.</para>
<para>
<emphasis>Step info.</emphasis>
</para>
</listitem>
<listitem>
<para>Step.</para>
<para>
<emphasis>Step info:</emphasis>
</para>
<para>
<emphasis>- Comment:</emphasis>
</para>
<para>
<emphasis>- Comment:</emphasis>
</para>
<para>
<emphasis>- Comment:</emphasis>
</para>
</listitem>
</orderedlist>
Je premier tour tous <p id="258">
éléments en <listitem><para>
:
<xsl:template match="AIT:p[@id='258'][1]">
<orderedlist>
<xsl:for-each select="../AIT:p[@id='258']">
<xsl:call-template name="stepNoLine"/>
</xsl:for-each>
</orderedlist>
</xsl:template>
<xsl:template name="stepNoLine">
<listitem>
<para>
<xsl:apply-templates select="*|node()"/>
</para>
</listitem>
</xsl:template>
Et je supprime tous les éléments non-premiers:
<xsl:template match="AIT:p[@id='258'][position() > 1]"/>
So far so good:
<orderedlist>
<listitem>
<para>Step.</para>
</listitem>
<listitem>
<para>Step.</para>
</listitem>
<listitem>
<para>Step.</para>
</listitem>
</orderedlist>
Mais maintenant, je ne sais pas comment prendre soin de <p id="1123">
éléments. Tous <p id="1123">
entre deux <p id="258">
doivent être les frères et soeurs du premier <p id="258">
, et les enfants de <listitem>
. Encore une fois:
<listitem>
<para>Step.</para>
<para>
<emphasis>Step info.</emphasis>
</para>
</listitem>
Ma chétif tentative échoue honteusement méprisable:
<xsl:template name="stepNoLine">
<listitem>
<para>
<xsl:apply-templates select="*|node()"/>
</para>
<xsl:if test="following-sibling::AIT:p/@id='1123'">
<xsl:call-template name="stepInfo"/>
</xsl:if>
</listitem>
</xsl:template>
<xsl:template name="stepInfo">
<para>
<emphasis>
<xsl:apply-templates select="*|node()"/>
</emphasis>
</para>
</xsl:template>
je reçois quelque chose comme:
<orderedlist>
<listitem>
<para>Step.</para>
<para>
<emphasis>Step.</emphasis>
</para>
</listitem>
<listitem>
<para>Step.</para>
<para>
<emphasis>Step.</emphasis>
</para>
</listitem>
<listitem>
<para>Step.</para>
<para>
<emphasis>Step.</emphasis>
</para>
</listitem>
</orderedlist>
En d'autres termes, chaque élément <p id="258">
est copié deux fois. Je pensais que le <xsl:if>
faisait du prochain frère le nœud actuel, mais j'étais évidemment dans l'erreur.
D'autres tentatives (comme l'utilisation d'un xsl:for-each
au lieu de xsl:if
) ont échoué de manière tout aussi misérable.
Est-ce que quelqu'un peut me diriger dans la bonne direction?
pouvez-vous utiliser XSLT 2.0? –
J'utilise msxsl, mais selon Microsoft c'est XSLT 1.0 seulement. Je vois Saxon-HE 9.8 implémente XSLt 3.0 - cela ferait-il? –