XML / XSL段落元素嵌套问题

问题描述

尽管我的XSL无效,因为段落元素未正确嵌套,但我正在尝试使用此XML和XSL实现以下输出。我该如何克服?

XML

<Phrases>
    <Phrase>
        <FullText>Lorem ipsum dolor sit amet.</FullText>
    </Phrase>
    <Phrase>
        <FullText>Consectetur adipiscing elit.</FullText>
        <NewLine/>
    </Phrase>
    <Phrase>
        <FullText>Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</FullText>
    </Phrase>
    <Phrase>
        <FullText>Ut enim ad minim veniam.</FullText>
    </Phrase>
</Phrases>

XSL

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:call-template name="Phrase">
        <xsl:with-param name="Phrases" select="Phrases"/>
    </xsl:call-template>

    <!-- Phrase -->
    <xsl:template name="Phrase">
        <xsl:param name="Phrases"/>
        <p>
            <xsl:for-each select="$Phrases">
                <xsl:value-of select="FullText"/>
                <xsl:if test="position() != last() and not(NewLine)">
                    &#160;
                </xsl:if>
                <xsl:if test="position() != last() and NewLine">
                    </p><p>
                </xsl:if>
            </xsl:for-each>
        </p>
    </xsl:template>

</xsl:stylesheet>

预期产量

<p>Lorem ipsum dolor sit amet.&#160;Consectetur adipiscing elit.</p>
<p>Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&#160;Ut enim ad minim veniam.</p>

解决方法

使用XSLT 2或3即可使用

  <xsl:template match="Phrases">
      <xsl:for-each-group select="Phrase" group-ending-with="Phrase[NewLine]">
          <p>
              <xsl:value-of select="current-group()/FullText" separator="&#160;"/>
          </p>
      </xsl:for-each-group>
  </xsl:template>