需要XSLT用于多行项目

时间:2012-03-26 09:40:23

标签: 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时,我总是在一个内部使用所有“auth functions 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>

现在我一次性收到所有“auth functions xx”。我对XSLT的理解是有限的,所以我的主要问题是如何限制搜索我所在的XML文档部分。

我认为这是一个非常简单的动作,但经过三天的网络和堆栈溢出研究后,我还没有得到答案。

铜 安德烈亚斯

2 个答案:

答案 0 :(得分: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;')"/>

答案 1 :(得分:0)

问题是,我认为,你正在迭代名称元素,就像这样......

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

但是,当您在 xsl:for-each 中获取applicationFunction时,您可以执行此操作...

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

由于表达式开头的正斜杠,这将使所有 applicationFunctions 相对于文档的根目录,而不是您当前所在的 authorizationGroup

你需要做的就是......

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

..是获取父元素,因为您当前位于名称元素上,该元素与应用程序元素处于同一级别。

实际上,稍微好一点的是最初迭代 authorizationGroup

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

然后迭代 applicationFunctions ,如此

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