2012-03-26 72 views
0

我已經在堆棧溢出上嘗試了很多東西,但我仍然面臨同樣的問題。需要用於多行項目的XSLT

讓我試着解釋我的問題以及我需要達到的目標。爲此,我有以下XML:

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

我需要出去這樣的事情:

<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我總是結束了所有的「授權功能xx」。

我當前的代碼片段看起來是這樣的(但顯然不止這部分):

 <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:for-each select="/authorizationGroups/authorizationGroup/name"> 

但是,當你來到得到這個XSL內applicationFunctions:對,每個,你這樣做......

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

因爲在表達式的開始正斜槓,這將得到所有應用程序函數相對於文檔的根目錄,而不是授權組您目前所在。

你需要做的這是什麼?

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

的..是讓父元素,因爲你正在位於元素是在同一水平應用上元件。

事實上,這將是更好略低將它最初itereate在authorizationgroup等下手

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

然後遍歷applicationFunctions像這樣

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

輝煌 - 你讓我很快樂。非常感謝你! – user1292584 2012-03-26 12:58:23

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

喜添!感謝您的回答。試用過,但問題是沒有斷行或逗號,但我收到的所有「身份驗證功能XX」這樣的事實: \t \t \t \t \t \t身份驗證功能1 \t \t \t \t \t身份驗證功能2 \t \t \t \t,\t \t \t \t \t \t AUTH功能15 \t \t \t \t \t身份驗證功能16 \t \t \t \t,我可以處理逗號後,但現在我收到了太多身份驗證功能(四而不是兩個) – user1292584 2012-03-26 10:01:32