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

时间:2016-04-15 15:23:13

标签: xslt-2.0

我有以下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>

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

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

1 个答案:

答案 0 :(得分:1)

我认为使用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>

每次实施都需要衡量效率。