2016-04-15 7 views
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

私は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> 

効率性は、あなたがそれぞれの実装のために測定しなければならないものです。

関連する問題