多行项目需要XSLT

多行项目需要XSLT,xslt,Xslt,我已经在这里尝试了很多关于堆栈溢出的方法,但是我仍然面临同样的问题 让我试着解释一下我的问题以及我需要实现的目标。为此,我有以下XML: <authorizationGroups> <authorizationGroup> <!-- can be multiple --> <name>OGroup 1</name> <application>

我已经在这里尝试了很多关于堆栈溢出的方法,但是我仍然面临同样的问题

让我试着解释一下我的问题以及我需要实现的目标。为此,我有以下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时,我总是在一个XSLT中包含所有的auth函数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函数xx。我对XSLT的理解是有限的,所以我的主要问题是如何将对XSLT的搜索限制在我所处的XML文档部分

我认为这是一个非常简单的操作,但是在对网络和堆栈溢出进行了三天的研究之后,我还没有找到答案

特写
Andreas

或者将线路中断线像未测试的一样封闭起来:

                    <xsl:for-each select="/authorizationGroups/authorizationGroup/application/applicationFunctions">
                        <xsl:value-of select=".//text()"/>
                        <xsl:text>,
</xsl:text>
                    </xsl:for-each>    
                        <xsl:value-of select="concat(.//text(), ',&#10;')"/>
或者将其作为一种逃避,包括在类似未经测试的:

                    <xsl:for-each select="/authorizationGroups/authorizationGroup/application/applicationFunctions">
                        <xsl:value-of select=".//text()"/>
                        <xsl:text>,
</xsl:text>
                    </xsl:for-each>    
                        <xsl:value-of select="concat(.//text(), ',&#10;')"/>

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

<xsl:for-each select="/authorizationGroups/authorizationGroup/name">
但是,当您在这个xsl:for-each中获取应用程序函数时,您可以这样做

<xsl:for-each  
   select="/authorizationGroups/authorizationGroup/application/applicationFunctions">
由于表达式开头的正斜杠,这将获得相对于文档根的所有应用程序函数,而不是您当前所在的authorizationGroup

你需要做的是

<xsl:for-each select="../application/applicationFunctions">
这个。。是获取父元素,因为您当前位于与应用程序元素处于同一级别的name元素上

事实上,最好的办法是首先创建一个过度授权的组

<xsl:for-each select="/authorizationGroups/authorizationGroup">
然后像这样迭代应用程序函数


嗨,蒂姆!谢谢你的回答。尝试了这两种方法,但问题不在于换行符或逗号,而在于我接收到的所有身份验证函数xx如下:身份验证函数1身份验证函数2身份验证函数15身份验证函数16,我可以稍后处理逗号,但是现在我收到了太多的auth函数,四个而不是两个——你让我很开心。非常感谢你!