转换 blockquote 并正确列出 XSLT

Transform blockquote and lists correctly XSLT

亲爱的 Whosebug 社区

我是 XSLT 主题的初学者,需要您的帮助来完成我的 XSLT 文件。

我有以下源 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<k4Export xmlns="http://www.vjoon.com/K4Export/2.6"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" format="intermediate" version="2.6" xsi:schemaLocation="http://www.vjoon.com/K4Export/2.6 K4Export_2_6.xsd">
    <publication>
        <id>1623922730691</id>
        <name>Digital First</name>
        <displayName>Digital First Topix</displayName>
        <origin>Standalone XMLExporter Sample Configuration</origin>
        <issue>
            <article>
                <attachment>
                    <id>24972</id>
                    <objectType>2</objectType>
                    <textObject>
                        <id>24972</id>
                        <k4ObjectID>24971</k4ObjectID>
                        <name>Bedeutung Descartes gilt als der Begründer des mod</name>
                        <objectVersion>908</objectVersion>
                        <objectVersionDateTime>2021-08-16T08:25:42Z</objectVersionDateTime>
                        <objectType>2</objectType>
                        <wfChannel>
                            <id>23370</id>
                            <originalID>1565</originalID>
                            <name>Artikel [Print]</name>
                            <outputChannel>
                                <id>23214</id>
                                <originalID>1061</originalID>
                                <name>Print</name>
                            </outputChannel>
                            <workflow>
                                <id>23369</id>
                                <originalID>1065</originalID>
                                <wfDefinitionType>1</wfDefinitionType>
                                <name>Artikel</name>
                            </workflow>
                        </wfChannel>
                        <section>
                            <id>49</id>
                            <name>Digital First</name>
                            <displayName>Digital First</displayName>
                        </section>
                        <status>
                            <id>23398</id>
                            <name>Content erstellt</name>
                        </status>
                        <layoutID>24802</layoutID>
                        <workflowActive>true</workflowActive>
                        <text>
                            <inlineTag name="Textabschnitt">
                                <inlineTag name="h1">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</inlineTag>
                            <inlineTag name="blockquote">„ Das wird eine ‚Tosca‘, die man so noch nicht gesehen hat. “<break type="paragraph" /></inlineTag>
                            <inlineTag name="blockquote-cite">Roland Geyer, Intendant Theater an der Wien</inlineTag>
                            <inlineTag name="ul">eine Erkenntnistheorie, die nur das als richtig akzeptiert, was durch die eigene schrittweise Analyse und logische Reflexion als plausibel verifiziert wird,<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ul">eine Ethik, gemäß der das Individuum sich im Sinne bewährter gesellschaftlicher Konventionen pflichtbewusst und moralisch zu verhalten hat,<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ul">eine Metaphysik, die zwar (durch logischen Beweis) die Existenz eines vollkommenen Schöpfer-Gottes annimmt, aber kirchenartigen Institutionen wenig Raum lässt,<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ul">eine Physik, die die Natur als durch zwar gottgegebene, aber allgemein gültige Gesetze geregelt betrachtet und dem Menschen ihre rationale Erklärung und damit letztlich ihre Beherrschung zur Aufgabe macht.<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="p">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</inlineTag>
                            <inlineTag name="ol">zunächst lateinisch gedruckt wurden 1641 in Paris die Méditations sur la philosophie première, dans laquelle sont démontrées l’existence de Dieu et l’immortalité de l’âme (so der Titel einer französischen Übersetzung von 1647; deutsch «Meditationen über die Erste Philosophie, in der die Existenz Gottes und die Unsterblichkeit der Seele bewiesen wird»). Die zweite Auflage 1642 in Amsterdam erschien mit geändertem Untertitel, «denn ich kann nicht beweisen, dass Gott die Seele nicht vernichten könnte, sondern nur, dass sie von völlig anderer Natur als der Körper ist und nicht mit dem Körper stirbt» (Brief an Marin Mersenne vom 24. Dezember 1640). Der Untertitel lautete nun: Méditations sur la philosophie première, dans laquelle sont démontrées l’existence de Dieu et la distinction de l’âme et du corps (deutsch «Meditationen über die Erste Philosophie, in der die Existenz Gottes und der Unterschied zwischen Seele und Körper bewiesen wird»).<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ol">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</inlineTag>
                            <inlineTag name="blockquote">„ Das wird eine ‚Tosca‘, die man so noch nicht gesehen hat. “<break type="paragraph" /></inlineTag>
                            <inlineTag name="blockquote-cite">Roland Geyer, Intendant Theater an der Wien</inlineTag>
                        <inlineTag name="p">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</inlineTag>
                        </inlineTag>
                    </text>
                </textObject>
            </attachment>
        </article>
    </issue>
</publication>
</k4Export>

和我的 XSLT 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="k4 xsl" version="1.0"
    xmlns:k4="http://www.vjoon.com/K4Export/2.6" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="k4:*"/>
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
    <xsl:template match="/">
        <xsl:apply-templates select="k4:k4Export/k4:publication/k4:issue/k4:article"/>
    </xsl:template>
    <xsl:template match="k4:article">
        <xsl:variable name="workflow" select="./k4:wfChannel/k4:workflow/k4:name"/>
        <xsl:variable name="channel" select="./k4:wfChannel/k4:outputChannel/k4:name"/>
        <xsl:variable name="category" select="./k4:metaData[k4:name='WP Kategorie']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="author" select="./k4:metaData[k4:name='Author']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="post_tag" select="./k4:metaData[k4:name='SEO Keywords']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="status" select="./k4:status/k4:name"/>
        <xsl:variable name="seo_synonyms" select="./k4:metaData[k4:name='SEO Synonyms']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="seo_keywords" select="./k4:metaData[k4:name='SEO Keywords']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="seo_meta_description" select="./k4:metaData[k4:name='SEO Meta Description']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="seo_title" select="./k4:metaData[k4:name='SEO Title']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="wp_category" select="./k4:metaData[k4:name='WP Kategorie']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="field_author" select="./k4:metaData[k4:name='Author']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="wfObjectVariantId" select="./k4:id"/>
        <export>
            <xsl:attribute name="wfObjectVariantId">
                <xsl:value-of select="$wfObjectVariantId"/>
            </xsl:attribute>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_workflow</xsl:attribute>
                <xsl:value-of select="$workflow"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_channel</xsl:attribute>
                <xsl:value-of select="$channel"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">category</xsl:attribute>
                <xsl:value-of select="$category"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">author</xsl:attribute>
                <xsl:value-of select="$author"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">post_tag</xsl:attribute>
                <xsl:value-of select="$post_tag"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_status</xsl:attribute>
                <xsl:value-of select="$status"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_seo_synonyms</xsl:attribute>
                <xsl:value-of select="$seo_synonyms"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_seo_keywords</xsl:attribute>
                <xsl:value-of select="$seo_keywords"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_seo_meta_description</xsl:attribute>
                <xsl:value-of select="$seo_meta_description"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_seo_title</xsl:attribute>
                <xsl:value-of select="$seo_title"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_wp_kategorie</xsl:attribute>
                <xsl:value-of select="$wp_category"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_author</xsl:attribute>
                <xsl:value-of select="$field_author"/>
            </xsl:element>
            <xsl:apply-templates select="./k4:attachment"/>
        </export>
    </xsl:template>
    <xsl:template match="k4:table" name="handleTable">
        <xsl:apply-templates select="." mode="copy-no-namespaces"/>
    </xsl:template>
    <xsl:template match="k4:attachment">
        <xsl:for-each select="k4:textObject/k4:text">
            <textobject>
                    <xsl:apply-templates/>
            </textobject>
        </xsl:for-each>
        <xsl:for-each select="k4:other">
        <image>
            <imgname>
                <xsl:value-of select="./k4:preview/k4:file"/>
            </imgname>
            <caption>
                <xsl:value-of select="./k4:metaData[k4:name='SEO Caption DE']/k4:metaDataValue/k4:string"/>
            </caption>
        </image>
    </xsl:for-each>
    </xsl:template>


    
    <!-- Sucht nach InDesign Tags und erstellt basierend auf ihnen HTML-Tags mit Klasse «imported» für das CSS -->
    <xsl:template match="k4:inlineTag/k4:inlineTag">
        <xsl:choose>
            <xsl:when test="./@name='h1'">
                <h1 class="imported">
                    <xsl:apply-templates/>
                </h1>    
            </xsl:when>
            <xsl:when test="./@name='h2'">
                <h2 class="imported">
                    <xsl:apply-templates/>
                </h2>    
            </xsl:when>
            <xsl:when test="./@name='h3'">
                <h3 class="imported">
                    <xsl:apply-templates/>
                </h3>    
            </xsl:when>
            <xsl:when test="./@name='h4'">
                <h4 class="imported">
                    <xsl:apply-templates/>
                </h4>    
            </xsl:when>
            <xsl:when test="./@name='h5'">
                <h5 class="imported">
                    <xsl:apply-templates/>
                </h5>    
            </xsl:when>
            <xsl:when test="./@name='h6'">
                <h6 class="imported">
                    <xsl:apply-templates/>
                </h6>
            </xsl:when>
            <xsl:when test="./@name='p'">
                <p class="imported">
                    <xsl:apply-templates/>
                </p>
            </xsl:when>
            <xsl:when test="./@name='body'">
                <p class="imported">
                    <xsl:apply-templates/>
                </p>
            </xsl:when>
            <xsl:when test="./@name='[Einf. Abs.]'">
                <p class="imported">
                    <xsl:apply-templates/>
                </p>
            </xsl:when>
            <xsl:when test="./@name='[Basic Paragraph]'">
                <p class="imported">
                    <xsl:apply-templates/>
                </p>
            </xsl:when>
            <xsl:when test="./@name='strong'">
                <b class="imported">
                    <xsl:value-of select="normalize-space(.)"/>
                </b>    
            </xsl:when>
            <xsl:when test="./@name='bold'">
                <b class="imported">
                    <xsl:value-of select="normalize-space(.)"/>
                </b>    
            </xsl:when>
           <xsl:when test="./@name='i'">
                <i class="imported">
                    <xsl:value-of select="normalize-space(.)"/>
                </i>    
            </xsl:when> 
            <xsl:when test="./@name='a'">
                <a class="imported">
                    <xsl:attribute name="href"><xsl:value-of select="./k4:attribute/@value"/></xsl:attribute>
                    <xsl:value-of select="normalize-space(.)"/>
                </a>    
            </xsl:when>   
            <xsl:otherwise>
                <!--<p class="imported">
                    <xsl:apply-templates/>
                </p>-->
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="*" mode="copy-no-namespaces">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates mode="copy-no-namespaces" select="node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

这导致:

<?xml version="1.0" encoding="UTF-8"?>
<export wfObjectVariantId="">
   <metadata name="field_workflow"/>
   <metadata name="field_channel"/>
   <metadata name="category"/>
   <metadata name="author"/>
   <metadata name="post_tag"/>
   <metadata name="field_status"/>
   <metadata name="field_seo_synonyms"/>
   <metadata name="field_seo_keywords"/>
   <metadata name="field_seo_meta_description"/>
   <metadata name="field_seo_title"/>
   <metadata name="field_wp_kategorie"/>
   <metadata name="field_author"/>
   <textobject>
      <h1 class="imported">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</h1>
      <p class="imported">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</p>
      <p class="imported">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</p>
   </textobject>
</export>

正如您从输出中看到的那样,我可以正确转换格式 (h1/p)。 但是,如果我现在只是在 xsl:choose 中添加内容:

<xsl:when test="./@name='ul'">
                <li class="imported">
                    <xsl:apply-templates/>
                </li>    
            </xsl:when>
            <xsl:when test="./@name='ol'">
                <li class="imported">
                    <xsl:apply-templates/>
                </li>    
            </xsl:when>
            <xsl:when test="./@name='blockquote'">
                <blockquote class="imported">
                    <xsl:apply-templates/>
                </blockquote>    
            </xsl:when>

然后,当然,块引用和列表项被采用,但不正确。

当我 运行 这个 XSLT 转换时,我得到了列表和 blockquote 的正确结果:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="k4 xsl" version="1.0"
    xmlns:k4="http://www.vjoon.com/K4Export/2.6" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="k4:*"/>
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
    <xsl:template match="/">
        <xsl:apply-templates select="k4:k4Export/k4:publication/k4:issue/k4:article"/>
    </xsl:template>
    <xsl:template match="k4:article">
        <xsl:variable name="workflow" select="./k4:wfChannel/k4:workflow/k4:name"/>
        <xsl:variable name="channel" select="./k4:wfChannel/k4:outputChannel/k4:name"/>
        <xsl:variable name="category" select="./k4:metaData[k4:name='WP Kategorie']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="author" select="./k4:metaData[k4:name='Author']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="post_tag" select="./k4:metaData[k4:name='SEO Keywords']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="status" select="./k4:status/k4:name"/>
        <xsl:variable name="seo_synonyms" select="./k4:metaData[k4:name='SEO Synonyms']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="seo_keywords" select="./k4:metaData[k4:name='SEO Keywords']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="seo_meta_description" select="./k4:metaData[k4:name='SEO Meta Description']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="seo_title" select="./k4:metaData[k4:name='SEO Title']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="wp_category" select="./k4:metaData[k4:name='WP Kategorie']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="field_author" select="./k4:metaData[k4:name='Author']/k4:metaDataValue/k4:string"/>
        <xsl:variable name="wfObjectVariantId" select="./k4:id"/>
        <export>
            <xsl:attribute name="wfObjectVariantId">
                <xsl:value-of select="$wfObjectVariantId"/>
            </xsl:attribute>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_workflow</xsl:attribute>
                <xsl:value-of select="$workflow"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_channel</xsl:attribute>
                <xsl:value-of select="$channel"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">category</xsl:attribute>
                <xsl:value-of select="$category"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">author</xsl:attribute>
                <xsl:value-of select="$author"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">post_tag</xsl:attribute>
                <xsl:value-of select="$post_tag"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_status</xsl:attribute>
                <xsl:value-of select="$status"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_seo_synonyms</xsl:attribute>
                <xsl:value-of select="$seo_synonyms"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_seo_keywords</xsl:attribute>
                <xsl:value-of select="$seo_keywords"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_seo_meta_description</xsl:attribute>
                <xsl:value-of select="$seo_meta_description"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_seo_title</xsl:attribute>
                <xsl:value-of select="$seo_title"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_wp_kategorie</xsl:attribute>
                <xsl:value-of select="$wp_category"/>
            </xsl:element>
            <xsl:element name="metadata">
                <xsl:attribute name="name">field_author</xsl:attribute>
                <xsl:value-of select="$field_author"/>
            </xsl:element>
            <xsl:apply-templates select="./k4:attachment"/>
        </export>
    </xsl:template>
    <xsl:template match="k4:table" name="handleTable">
        <xsl:apply-templates select="." mode="copy-no-namespaces"/>
    </xsl:template>
    <xsl:template match="k4:attachment">
        <xsl:for-each select="k4:textObject/k4:text">
            <textobject>
                    <xsl:apply-templates/>
            </textobject>
        </xsl:for-each>
        <xsl:for-each select="k4:other">
        <image>
            <imgname>
                <xsl:value-of select="./k4:preview/k4:file"/>
            </imgname>
            <caption>
                <xsl:value-of select="./k4:metaData[k4:name='SEO Caption DE']/k4:metaDataValue/k4:string"/>
            </caption>
        </image>
    </xsl:for-each>
    </xsl:template>



    
    <!-- Hier wird Blockquote/UL übernommen -->
    <xsl:template match="/k4:k4Export/k4:publication/k4:issue/k4:article/k4:attachment/k4:textObject/k4:text/k4:inlineTag">
        <xsl:for-each-group select="k4:inlineTag" group-starting-with="blockquote">
            <blockquote>
                <xsl:attribute name="cite"><xsl:value-of select="current-group()[self::k4:inlineTag[@name='blockquote-cite']]"/></xsl:attribute>
                <xsl:value-of select="current-group()[self::k4:inlineTag[@name='blockquote']]"/>
            </blockquote>
        </xsl:for-each-group>
        <xsl:for-each-group select="*" group-adjacent="@name = 'ol'">   
            <xsl:choose>
                <xsl:when test="current-grouping-key()">
                    <ol>
                        <xsl:apply-templates select="current-group()"/> 
                    </ol>
                </xsl:when>
            </xsl:choose>
        </xsl:for-each-group>
        <xsl:for-each-group select="*" group-adjacent="@name = 'ul'">   
            <xsl:choose>
                <xsl:when test="current-grouping-key()">
                    <ul>
                        <xsl:apply-templates select="current-group()"/> 
                    </ul>
                </xsl:when>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:template>
    <xsl:template match="k4:inlineTag/k4:inlineTag">
        <xsl:choose>
            <xsl:when test="./@name='ol'">
                <li class="imported">
                    <xsl:apply-templates/>
                </li>    
            </xsl:when>
            <xsl:when test="./@name='ul'">
                <li class="imported">
                    <xsl:apply-templates/>
                </li>    
            </xsl:when>
        </xsl:choose>
    </xsl:template>




    <xsl:template match="*" mode="copy-no-namespaces">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates mode="copy-no-namespaces" select="node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

结果:

<?xml version="1.0" encoding="UTF-8"?>
<export wfObjectVariantId="">
   <metadata name="field_workflow"/>
   <metadata name="field_channel"/>
   <metadata name="category"/>
   <metadata name="author"/>
   <metadata name="post_tag"/>
   <metadata name="field_status"/>
   <metadata name="field_seo_synonyms"/>
   <metadata name="field_seo_keywords"/>
   <metadata name="field_seo_meta_description"/>
   <metadata name="field_seo_title"/>
   <metadata name="field_wp_kategorie"/>
   <metadata name="field_author"/>
   <textobject>
      <blockquote cite="Roland Geyer, Intendant Theater an der Wien">„ Das wird eine ‚Tosca‘, die man so noch nicht gesehen hat. “</blockquote>
      <ol>
         <li class="imported">zunächst lateinisch gedruckt...</li>
         <li class="imported">Ebenfalls erst nachträglich...</li>
      </ol>
      <ul>
         <li class="imported">eine Erkenntnistheorie, die..</li>
         <li class="imported">eine Ethik, gemäß...</li>
         <li class="imported">eine Metaphysik, die...</li>
         <li class="imported">eine Physik, die ...</li>
      </ul>
   </textobject>
</export>

所以这里的块引用和块引用是正确的。 我现在需要你的帮助,因为不幸的是我缺乏知识。我现在如何在逻辑上和功能上将这两个样式表相互组合,以便获得以下结果?:

<?xml version="1.0" encoding="UTF-8"?>
<export wfObjectVariantId="">
   <metadata name="field_workflow"/>
   <metadata name="field_channel"/>
   <metadata name="category"/>
   <metadata name="author"/>
   <metadata name="post_tag"/>
   <metadata name="field_status"/>
   <metadata name="field_seo_synonyms"/>
   <metadata name="field_seo_keywords"/>
   <metadata name="field_seo_meta_description"/>
   <metadata name="field_seo_title"/>
   <metadata name="field_wp_kategorie"/>
   <metadata name="field_author"/>
   <textobject>
      <h1 class="imported">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</h1>
      <blockquote cite="Roland Geyer, Intendant Theater an der Wien">„ Das wird eine ‚Tosca‘, die man so noch nicht gesehen hat. “</blockquote>
      <ul>
         <li class="imported">eine Erkenntnistheorie, die...</li>
         <li class="imported">eine Ethik, gemäß...</li>
         <li class="imported">eine Metaphysik, die...</li>
         <li class="imported">eine Physik, die...</li>
      </ul>
      <blockquote cite="Roland Geyer, Intendant Theater an der Wien">„ Das wird eine ‚Tosca‘, die man so noch nicht gesehen hat. “</blockquote>
      <p class="imported">Ebenfalls erst nachträglich...</p>
      <ol>
         <li class="imported">zunächst lateinisch gedruckt...</li>
         <li class="imported">Ebenfalls erst nachträglich...</li>
      </ol>
      <p class="imported">Ebenfalls erst nachträglich...</p>
   </textobject>
</export>

我认为,在进行分组的模板中,您宁愿需要一些通用的 group-adjacent="@name" 然后区分,例如而不是

<xsl:template match="/k4:k4Export/k4:publication/k4:issue/k4:article/k4:attachment/k4:textObject/k4:text/k4:inlineTag">
    <xsl:for-each-group select="k4:inlineTag" group-starting-with="blockquote">
        <blockquote>
            <xsl:attribute name="cite"><xsl:value-of select="current-group()[self::k4:inlineTag[@name='blockquote-cite']]"/></xsl:attribute>
            <xsl:value-of select="current-group()[self::k4:inlineTag[@name='blockquote']]"/>
        </blockquote>
    </xsl:for-each-group>
    <xsl:for-each-group select="*" group-adjacent="@name = 'ol'">   
        <xsl:choose>
            <xsl:when test="current-grouping-key()">
                <ol>
                    <xsl:apply-templates select="current-group()"/> 
                </ol>
            </xsl:when>
        </xsl:choose>
    </xsl:for-each-group>
    <xsl:for-each-group select="*" group-adjacent="@name = 'ul'">   
        <xsl:choose>
            <xsl:when test="current-grouping-key()">
                <ul>
                    <xsl:apply-templates select="current-group()"/> 
                </ul>
            </xsl:when>
        </xsl:choose>
    </xsl:for-each-group>
</xsl:template>

你想要

<xsl:template match="/k4:k4Export/k4:publication/k4:issue/k4:article/k4:attachment/k4:textObject/k4:text/k4:inlineTag">
    <xsl:for-each-group select="k4:inlineTag" group-adjacent="replace(@name, '-cite$', '')">
       <xsl:choose>
          <xsl:when test="current-grouping-key() = 'blockquote'">
             <blockquote cite="{current-group()[2]}">
               <xsl:value-of select="."/>
             </blockquote>
          </xsl:when>
          <xsl:when test="current-grouping-key() = ('ul', 'ol')">
             <xsl:element name="{current-grouping-key()}">
                <xsl:apply-templates select="current-group()"/>
             </xsl:element>
          </xsl:when>
          <xsl:otherwise>
             <xsl:apply-templates select="current-group()"/>
          </xsl:otherwise>
       </xsl:choose>
    </xsl:for-each-group>
</xsl:template>

如果输入中可以有相邻的 blockquote,您需要在 <xsl:when test="current-grouping-key() = 'blockquote'"> 内部使用 <xsl:for-each-group select="current-group()" group-starting-with="k4:inlineTag[@name = 'blockquote']">..</xsl:for-each-group> 将它们拆分为单独的 blockquote 结果.