Ich habe die folgende XML:Anruf benannte Vorlage für die nächste Geschwister
<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>
ich es in ein DocBook drehen muss <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>
ich zuerst schalten Sie alle <p id="258">
Elemente in <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>
Und ich lösche alle nicht-ersten Elemente:
<xsl:template match="AIT:p[@id='258'][position() > 1]"/>
So weit so gut:
<orderedlist>
<listitem>
<para>Step.</para>
</listitem>
<listitem>
<para>Step.</para>
</listitem>
<listitem>
<para>Step.</para>
</listitem>
</orderedlist>
Aber jetzt weiß ich nicht, wie von <p id="1123">
Elemente kümmern. Alle <p id="1123">
zwischen zwei <p id="258">
müssen Geschwister der ersten <p id="258">
und Kinder von <listitem>
sein. Nochmal:
<listitem>
<para>Step.</para>
<para>
<emphasis>Step info.</emphasis>
</para>
</listitem>
Mein kümmerlicher Versuch fehlschlägt schändlich in Unehre: ist
<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>
Mit anderen Worten, jedes <p id="258">
Element zweimal kopiert:
<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>
ich so etwas bekommen. Ich dachte, die <xsl:if>
machte das nächste Geschwister den aktuellen Knoten, aber ich war offensichtlich falsch.
Andere Versuche (wie mit einem xsl:for-each
anstelle von xsl:if
) scheiterten auf ebenso miserable Weise.
Kann mir bitte jemand in die richtige Richtung zeigen?
können Sie mit XSLT-2.0? –
Ich benutze msxsl, aber laut Microsoft ist das nur XSLT 1.0. Ich sehe Saxon-HE 9.8 implementiert XSLT 3.0 - würde das tun? –