2016-09-29 5 views
0

私は、次のツリー構造を持つXMLファイルを持っている:あなたは要素のfoo2はがfooの子要素ではありません見ることができますが、通りxsltで非子要素をグループ化する方法はありますか?

<foo attr1=""/> 
<foo2 num="1"/> 
<foo2 num="2"/> 
<foo2 num="3"/> 
<foo2 num="4"/> 
<foo attr1=""/> 
<foo2 num="1"/> 
... 

私はへ グループfoo2はnum個=「1」スルーをしたいと思いますnum = "4"、最初のfoo発生。私は参照として使用することができませんでした 属性はありません...

xslでこれを達成する方法はありますか?

私はすべてのfooの出現を簡単に(xsl:for-each属性を使用して)ループすることに成功しましたが、各fooループに次のfoo2要素を含めるのが難しい部分です。

EDIT:ように私は何をしたいのか

<foo attr1="abc"/> 
<foo2 num="1"/> 
<foo2 num="2"/> 
<foo2 num="3"/> 
<foo2 num="4"/> 
<foo attr1="def"/> 
<foo2 num="1"/> 

テーブルでグループABCと以下、fooのです:: はattrがのようなランダムな値を持っているふりをすることができます

+--------+-----+ 
| abc | def | 
| 1  | 1 | 
| 2  |  | 
| 3  |  | 
| 4  |  | 
+--------------+ 

ありません残念ながら、xslt 2.0はサポートしていません。

+0

** 1 **あなたの質問は完全には明らかではありません。期待される出力を見せてください。 ** 2。**あなたのプロセッサはXSLT 2.0をサポートしていますか? –

+0

@ michael.hor257k私の投稿を更新しました。 – Mnemonics

答えて

1

あなたがここに二つの別々の問題を抱えている:

  1. どのグループのノードを、XSLT 2.0のgroup-starting-withと同等のものを使用します。 HTMLテーブルは行ごとを構築しているにもかかわらず - あなたは各グループがを占めているテーブルを構築することができるよう

  2. はどのように、(ピボット)結果移調します。

    XSLT次の例の入力に印加さ1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    
    <xsl:key name="grp" match="foo2" use="generate-id(preceding-sibling::foo[1])" /> 
    
    <!-- first-pass --> 
    <xsl:variable name="groups-rtf"> 
        <xsl:for-each select="root/foo"> 
         <group name="{@attr1}"> 
          <xsl:for-each select="key('grp', generate-id())"> 
           <item><xsl:value-of select="@num"/></item> 
          </xsl:for-each> 
         </group> 
        </xsl:for-each> 
    </xsl:variable> 
    <xsl:variable name="groups" select="exsl:node-set($groups-rtf)/group" /> 
    
    <xsl:template match="/"> 
        <table border="1"> 
         <!-- header row --> 
         <tr> 
          <xsl:for-each select="$groups"> 
           <th><xsl:value-of select="@name"/></th> 
          </xsl:for-each> 
         </tr>  
         <!-- data rows --> 
         <xsl:call-template name="generate-rows"/> 
        </table> 
    </xsl:template> 
    
    <xsl:template name="generate-rows"> 
        <xsl:param name="i" select="1"/> 
        <xsl:if test="$groups/item[$i]"> 
         <tr> 
          <xsl:for-each select="$groups"> 
           <td><xsl:value-of select="item[$i]"/></td> 
          </xsl:for-each> 
         </tr> 
         <xsl:call-template name="generate-rows"> 
          <xsl:with-param name="i" select="$i + 1"/> 
         </xsl:call-template> 
        </xsl:if> 
    </xsl:template> 
    
    </xsl:stylesheet> 
    

私はあなたが2回のパスでこれを行うことをお勧め

XML

<root> 
    <foo attr1="abc"/> 
    <foo2 num="1"/> 
    <foo2 num="2"/> 
    <foo2 num="3"/> 
    <foo2 num="4"/> 
    <foo attr1="def"/> 
    <foo2 num="5"/> 
    <foo2 num="6"/> 
</root> 

(レンダリング)結果は次のようになります。

enter image description here

関連する問題