2012-03-26 17 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