如何使用文本内容进行分组?

How to group using text content?

我关注xml :

<note>
    <para>customer name :</para>
    <para>mr. Joe Someone</para>
    <para>calling from :</para>
    <para>1234567</para>
    <para>device model :</para>
    <para>ABC-123</para>
    <para>issue:</para>
    <para>some info</para>
    <para>some more info</para>
    <para>and even more info</para>
    <para>solution :</para>
    <para>some solutions</para>
    <para>and some more solutions</para>
</note>

并且我想在文本以双点结尾的每个节点上进行分组,因此结果将如下所示:

<note>
    <para>customer name :</para>
     <groupdata>
       <para>mr. Joe Someone</para>
     </groupdata>
    <para>calling from :</para>
     <groupdata>
      <para>1234567</para>
     </groupdata>
    <para>device model :</para>
     <groupdata>
      <para>ABC-123</para>
     </groupdata>
    <para>issue:</para>
     <groupdata>
      <para>some info</para>
      <para>some more info</para>
      <para>and even more info</para>
     </groupdata>
    <para>solution :</para>
     <groupdata>
      <para>some solutions</para>
      <para>and some more solutions</para>
     </groupdata>
</note>

最有效的方法是什么(使用 xslt 2.0)?

我认为使用 xsl:for-each-group select="*" group-starting-with="*[ends-with(., ':')]" 很简单:

<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="note">
        <xsl:copy>
            <xsl:for-each-group select="*" group-starting-with="*[ends-with(., ':')]">
                <xsl:copy-of select="."/>
                <groupdata>
                    <xsl:copy-of select="current-group() except ."/>
                </groupdata>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

效率是您必须为每个实施衡量的东西。