簡體   English   中英

XSLT 在 for-each 中應用模板

[英]XSLT apply-templates in for-each

我正在嘗試編寫一個簡單的 XHTML 到 Simple Docbook 轉換器(輸入 XHTML 是一個有限的子集,所以它應該是可行的)。

我有這個:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" standalone="no"/>
    <!--
    <xsl:strip-space elements="*"/>
    -->

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <!-- skip implicit tags-->
    <xsl:template match="/html/body"><xsl:apply-templates/></xsl:template>
    <xsl:template match="/html"><xsl:apply-templates/></xsl:template>

    <!-- paragraphs to sections converter -->
    <xsl:template match="h2">
        <xsl:variable name="title" select="generate-id(.)"/>
        <section>
            <title><xsl:apply-templates select="text()"/></title>
            <xsl:for-each select="following-sibling::*[generate-id(preceding-sibling::h2[1]) = $title and not(self::h2)]">
                <xsl:apply-templates/>
            </xsl:for-each>
        </section>
    </xsl:template>

    <xsl:template match="p">
        <para><xsl:apply-templates select="*|text()"/></para>
    </xsl:template>
    <xsl:template match="p[preceding-sibling::h2]"/>
    <xsl:template match="ul">
        <itemizedlist><xsl:apply-templates select="li"/></itemizedlist>
    </xsl:template>
    <xsl:template match="ul[preceding-sibling::h2]"/>
    <xsl:template match="ol">
        <orderedlist><xsl:apply-templates select="li"/></orderedlist>
    </xsl:template>
    <xsl:template match="ol[preceding-sibling::h2]"/>
    <xsl:template match="li">
        <listitem><para><xsl:apply-templates select="*|text()"/></para></listitem>
    </xsl:template>
</xsl:stylesheet>

對於這個輸入

<html>
<body>
<p>First paragraph</p>
<p>Second paragraph</p>
<h2>First title</h2>
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
<h2>Second title</h2>
<p>First paragraph</p>
<ul>
    <li>A list item</li>
    <li>Another list item</li>
</ul>
<p>Second paragraph</p>
</body>
</html>

我期待這個 output

<para>First paragraph</para>
<para>Second paragraph</para>
<section>
    <title>First title</title>
    <para>First paragraph</para>
    <para>Second paragraph</para>
    <para>Third paragraph</para>
</section>
<section>
    <title>Second title</title>
    <para>First paragraph</para>
    <itemizedlist>
        <listitem>A list item</listitem>
        <listitem>Another list item</listitem>
    </itemizedlist>
    <para>Second paragraph</para>
</section>

但我明白了

<para>First paragraph</para>
<para>Second paragraph</para>
<section><title>First title</title>First paragraphSecond paragraphThird paragraph</section>



<section><title>Second title</title>First paragraph
    <listitem><para>A list item</para></listitem>
    <listitem><para>Another list item</para></listitem>
Second paragraph</section>

出於某種原因,我的段落和列表的模板沒有被應用。 我猜是因為匹配的模板是空的,但我需要那些以防止在section之外重復標簽。

我怎樣才能使這項工作? TIA。

利用

        <xsl:for-each select="following-sibling::*[generate-id(preceding-sibling::h2[1]) = $title and not(self::h2)]">
            <xsl:apply-templates select="."/>
        </xsl:for-each>

或者干脆

        <xsl:apply-templates select="following-sibling::*[generate-id(preceding-sibling::h2[1]) = $title and not(self::h2)]"/>

處理要包裝到一個部分中的那些元素。 但是會與您的其他模板發生沖突,因此使用模式可能有助於處理:

<xsl:template match="p" mode="wrapped">
    <para><xsl:apply-templates select="*|text()"/></para>
</xsl:template>
<xsl:template match="p[preceding-sibling::h2]"/>
<xsl:template match="ul" mode="wrapped">
    <itemizedlist><xsl:apply-templates select="li"/></itemizedlist>
</xsl:template>
<xsl:template match="ul[preceding-sibling::h2]"/>
<xsl:template match="ol" mode="wrapped">
    <orderedlist><xsl:apply-templates select="li"/></orderedlist>
</xsl:template>
<xsl:template match="ol[preceding-sibling::h2]"/>
<xsl:template match="li" mode="wrapped">
    <listitem><para><xsl:apply-templates select="*|text()"/></para></listitem>
</xsl:template>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM