2012-03-26 2 views
0

私はすでにスタックオーバーフローで多くのことを試しましたが、私はまだ同じ問題に直面しています。マルチラインアイテムのXSLTが必要

問題を説明し、達成するために必要なことを教えてください。

<authorizationGroups>    
<authorizationGroup>   <!-- can be multiple --> 
    <name>OGroup 1</name> 
    <application>    <!-- can be multiple --> 
     <uid>646</uid> 
     <applicationFunctions> <!-- can be multiple --> 
      <name>auth function 11</name> 
      <name>auth function 12</name> 
     </applicationFunctions> 
    </application> 
    <role>5000682864</role> 
    <role>5000685391</role> 
</authorizationGroup> 
<authorizationGroup>   <!-- can be multiple --> 
    <name>OGroup 8</name> 
    <application>    <!-- can be multiple --> 
     <uid>646</uid> 
     <applicationFunctions> <!-- can be multiple --> 
      <name>auth function 13</name> 
      <name>auth function 14</name> 
     </applicationFunctions> 
    </application> 
    <role>5000683374</role> 
    <role>5000685391</role> 
</authorizationGroup> 

が、私はこのような何かを取得する必要があります:このために私は次のXMLを持って

<resource-types> 
<resource-types> 
     <resource-type> 
       <name>OGroup 1</name> 
       <actions>  
      auth function 11, 
      auth function 12 
       </actions> 
    </resource-type> 
     <resource-type> 
      <name>OGroup 8</name> 
       <actions> 
      auth function 13, 
      auth function 14 
       </actions> 
     </resource-type> 
</resource-types> 

私の問題は、私はいつもXSLT Iを使用する場合すべての "auth functions xx"が1つに収まるようになります。

 <resource-types> 
      <xsl:call-template name="resource_types"/> 
     </resource-types> 
<xsl:template name="resource_types"> 
    <resource-types> 
     <xsl:for-each select="/authorizationGroups/authorizationGroup/name"> 
      <resource-type> 
       <name> 
        <xsl:value-of select="text()"/> 
       </name> 
       <actions> 

        <xsl:for-each select="/authorizationGroups/authorizationGroup/application/applicationFunctions"> 
         <xsl:value-of select=".//text()"/> 
         , 
        </xsl:for-each>  
       </actions> 
      </resource-type> 
     </xsl:for-each> 
    </resource-types>  
</xsl:template> 

今、私は一度にすべての「認証機能XX」を受信:

私の現在のコードスニペットは、この(この部分よりは明らかに存在している)のように見えます。 XSLTについての私の理解は限られているので、私の主な質問は、私が入っているXML文書の部分への検索をどのように制限することができるかということです。

これは非常に簡単な操作だと思っていましたが、ネットとスタックのオーバーフローで私は答えを思い付いていない。

銅 アンドレアス

答えて

0

問題は、あなたがという名前の要素を反復しているということですあなたはこのXSL内applicationFunctionsを取得するために来るしかし

<xsl:for-each select="/authorizationGroups/authorizationGroup/name"> 

、:のために、各、あなたがこれを行う...ので、式の開始時に、スラッシュの

<xsl:for-each 
    select="/authorizationGroups/authorizationGroup/application/applicationFunctions"> 

これにより、applicationFunctionsがドキュメントのルートを基準にして取得され、authorizationGroupは現在ありません。

0123あなたがする必要がどのようながこれですあなたが現在 アプリケーションと同じレベルである要素の上に位置しているので...

<xsl:for-each select="../application/applicationFunctions"> 

は..親要素を取得することです素子。それは

<xsl:for-each select="/authorizationGroups/authorizationGroup"> 

で開始し、そう

<xsl:for-each select="application/applicationFunctions"> 
+0

ブリリアントを受ける16 \t \t \t \t、 \t \t \t認証機能。どうもありがとうございました! – user1292584

0

いずれか(未テスト)のよう<xsl:text>に改行を囲む:

    <xsl:for-each select="/authorizationGroups/authorizationGroup/application/applicationFunctions"> 
         <xsl:value-of select=".//text()"/> 
         <xsl:text>, 
</xsl:text> 
        </xsl:for-each>  

又は(未テスト)のような<xsl:value-of>のエスケープとしてそれを含む:

     <xsl:value-of select="concat(.//text(), ',&#10;')"/> 
+0

こんにちはティムのようなapplicationFunctionsを反復するために最初にitereate authorizationGroupを超えるだろう

実は、何がslighty良いだろう!ご回答有難うございます。両方を試してみましたが、問題は改行またはカンマではありませんが、私はすべてこのように、「認証の機能がxxを」受け取るという事実: \t \t \t \t \t \t認証機能1 \t \t \t \t \t認証機能2 \t \t \t \t、\t \t \t \t \t \t認証機能15 \tあなたが私の一日行われ - 私は、後にカンマを扱うことができますが、今、私はあまりにも多くの認証機能(代わりに2の4) – user1292584