1

XSLTでのグループ化を理解しようとしています。回答者(「pid」)によってリストされた質問票への回答を含むXMLドキュメントがあります。グラフなどを作成できるように、すべての回答者の回答を質問ごとにグループ化したいと思いました。基本的なXML構造は次のとおりです。

<survey>
    <answers>
        <pid xml:id="p1">
            <category key="#c1">
                <head>Category Heading</head>
                ... 
                <question key="#q1.4">
                    <answer key="#a2"/>
                    <answer key="#a3"/>
                    <answer key="#a4"/>
                </question
                ...
            </category
            ...
        </pid> 
        <pid xml:id="p2">
            <category key="#c1">
                <head>Category Heading</head>
                ... 
                <question key="#q1.4"> 
                    <answer key="#a2"/>
                    <answer key="#a3"/>
                    <answer key="#a4"/>
                </question
                ...
            </category
            ...
        </pid>   
        <pid xml:id="p3">
            <category key="#c1">
                <head>Category Heading</head>
                ... 
                <question key="#q1.4"> 
                    <answer key="#a2"/>                   
                </question
                ...
            </category
            ...
        </pid>   
        <pid xml:id="p4">
            <category key="#c1">
                <head>Category Heading</head>
             ... 
            <question key="#q1.4">
                <answer key="#a1"/>                                                             
            </question
            ...
            </category
            ...
        </pid>   
    </answers>
</survey>

また、回答者全体での各回答の発生をカウントしたいと思いました。XSLT 2.0for-each-groupを単独で使用してみましたが、希望どおりに動作させることができませんでした。最終的にMuenchian(XSLT 1.0)のグループ化手法と組み合わせて、最終的に機能させることができました。しかし、私はまだそれがどのように機能しているかを本当に理解していません。<answer>要素をグループ化するために使用したXSLTビットは次のとおりです。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    exclude-result-prefixes="#all"
    version="2.0">
    <xsl:output encoding="iso-8859-1" method="text"
        omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>     

    <xsl:key name="answerKey" match="answer" use="@key"/>
    <xsl:key name="answerKey3" match="answer" use="concat(generate-id(..),' ',@key)"/>

    <xsl:template match="/">
    ...
        <xsl:for-each-group select="/survey/answers/pid/category/question" group-by="@key">          
            <xsl:variable name="qKey" select="@key"/>
            <xsl:variable name="x" select="generate-id(.)"/>  
            <xsl:text>
            </xsl:text>
            <xsl:value-of select="substring-after(@key,'#')"/>                                            
            <xsl:for-each-group select="//answer[count(.|key('answerKey3',concat($x,' ',@key))[1])=1][parent::question[@key=$qKey]]" group-by="@key">
            <xsl:text>
            </xsl:text>    
                <xsl:variable name="aID" select="substring-after(@key,'#')"/>                               
                <!-- <xsl:value-of select="key('questionKey2',parent::question/@key)/Answers/Answer[@xml:id=$aID]"/> -->                
                <xsl:value-of select="substring-after(@key,'#')"/>                        
                <xsl:text>,</xsl:text>                                                       
                <xsl:value-of select="count(key('answerKey',@key)[ancestor::question[@key=$qKey]])"/>                 
            </xsl:for-each-group>  
            <xsl:text>
            </xsl:text>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

このコードを使用すると、質問ごとにグループ化された回答と回答数のコンマ区切りリストを出力できます。次に例を示します。

q1.4
a1,1
a2,3
a3,2
a4,2

これがどのように機能しているか、特にfor-each-groupMuenchian XPathを使用して<answer>要素をグループ化する2番目の(ネストされた)ものを誰かが説明できますか?

同じ結果を達成するためのより簡単な方法はありますか?ありがとうございました!

4

1 に答える 1