XSLT 2.0 выводит HTML-список на основе содержимого между самозакрывающимися элементами - PullRequest
0 голосов
/ 28 октября 2018

В моем XML-документе у меня есть вехи в тексте, закодированные с помощью самозакрывающегося элемента <milestone n="1"/>.Таким образом, текст выглядит так:

 <p>
   <seg><milestone n="1"/>Lorem ipsum dolor sit amet, consectetur adipiscing
    elit, sed do eiusmod tempor incididunt <milestone n="2"/>ut labore
    et dolore magna aliqua. Ut <quote>enim <note>ad</note></quote> minim <milestone n="3"/>veniam, 
    quis nostrud exercitation <milestone n="4"/>ullamco laboris nisi 
    ut aliquip ex ea commodo</seg>
   <seg>consequat. Duis aute irure dolor 
    <milestone n="5"/> in reprehenderit <quote>in</quote> voluptate velit esse cillum 
    dolore eu fugiat nulla pariatur.</seg>
 </p> 

В XSLT 2.0 я пытаюсь ориентироваться на вывод HTML, где все содержимое между <milestone/> помещается в элемент li HTML, игнорируя <seg> структура, но допускающая дальнейшую обработку по другим узлам:

<li>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt</li>
<li>ut labore et dolore magna aliqua. Ut enim ad minim</li>
<li>veniam, quis nostrud exercitation</li>
<li>ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor</li>
<li>in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</li>

Пример (ниже на основе this и this ) не функционировал ...

<xsl:template match="p" mode="diplo">
    <xsl:for-each-group select="node()" group-starting-with="milestone">
            <li>
                <xsl:sequence select="current()/ancestor::p//milestone/@*"/>
                <xsl:apply-templates select="current-group()[not(self::milestone)]"/>
            </li>
        </xsl:for-each-group>
</xsl:template>

РЕДАКТИРОВАТЬ: я обновил источник XML, чтобы сделать его более понятным (я не хочу только текст, но все узлы для дальнейшей обработки с применением шаблонов), и опубликовал неудачную попытку.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 октября 2018

Вам необходимо использовать for-each-group и @group-starting-with, как показано ниже:

XSLT 2.0:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="p">
        <p>
            <xsl:for-each-group select="seg/node()" group-starting-with="milestone">
                <xsl:sort select="@n"/>
                <li>
                    <!--<xsl:value-of select="normalize-space(string-join(current-group(),' '))"/>-->
                    <xsl:apply-templates select="current-group()[not(self::milestone)]"/>
                </li>
            </xsl:for-each-group>
        </p>
    </xsl:template>

    <xsl:template match="quote">
        <xsl:text>"</xsl:text><xsl:apply-templates/><xsl:text>"</xsl:text> <!--output contents of <quote> in " " -->
    </xsl:template>

    <xsl:template match="note">
        <xsl:text>[</xsl:text><xsl:apply-templates/><xsl:text>]</xsl:text> <!--output contents of <note> in [ ] -->
    </xsl:template>

</xsl:stylesheet>

ВХОД:

<?xml version="1.0" encoding="UTF-8"?>
<p>
   <seg><milestone n="1"/>Lorem ipsum dolor sit amet, consectetur adipiscing
    elit, sed do eiusmod tempor incididunt <milestone n="2"/>ut labore
    et dolore magna aliqua. Ut <quote>enim <note>ad</note></quote> minim <milestone n="3"/>veniam, 
    quis nostrud exercitation <milestone n="4"/>ullamco laboris nisi 
    ut aliquip ex ea commodo</seg>
   <seg>consequat. Duis aute irure dolor 
    <milestone n="5"/> in reprehenderit <quote>in</quote> voluptate velit esse cillum 
    dolore eu fugiat nulla pariatur.</seg>
 </p>

ВЫХОД:

<?xml version="1.0" encoding="UTF-8"?>
<p>
   <li>Lorem ipsum dolor sit amet, consectetur adipiscing
    elit, sed do eiusmod tempor incididunt </li>
   <li>ut labore
    et dolore magna aliqua. Ut "enim [ad]" minim </li>
   <li>veniam, 
    quis nostrud exercitation </li>
   <li>ullamco laboris nisi 
    ut aliquip ex ea commodoconsequat. Duis aute irure dolor 
    </li>
   <li> in reprehenderit "in" voluptate velit esse cillum 
    dolore eu fugiat nulla pariatur.</li>
</p>
...