转换块引用并正确列出 XSLT [关闭]

Posted

技术标签:

【中文标题】转换块引用并正确列出 XSLT [关闭]【英文标题】:Transform blockquote and lists correctly XSLT [closed] 【发布时间】:2021-11-01 14:22:02 【问题描述】:

尊敬的 *** 社区

我是 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 中添加内容:现在选择:

<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 转换时,我得到了列表和块引用的正确结果:

<?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>

【问题讨论】:

要问自己的一个问题是......“我有充分的理由将它们结合起来吗?”有许多应用程序应用一组渐进式 XSL 来获得所需的输出。传递另一个 ro 输入的输出。 【参考方案1】:

我认为,在进行分组的模板中,您宁愿需要一些通用的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>

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

【讨论】:

我不知道你怎么能从我原来的问题中给出如此简短、完美和有针对性的答案。你真的是个天使,所以效果很好!

以上是关于转换块引用并正确列出 XSLT [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将引用的文档作品转换为 bibtex 或尾注格式 [关闭]

XSLT XML 到 HTML 的 2 阶段转换 - 必须是更好的方法

Rcpp:通过引用列出<->矩阵转换?? + 使用矩阵编程时优化内存分配

Oracle PL/SQL 引用游标如何

如何使用相对路径在 XSLT 中引用 CSS

转换时,XSLT不会创建正确的行数