多行项目需要XSLT
我已经在这里尝试了很多关于堆栈溢出的方法,但是我仍然面临同样的问题 让我试着解释一下我的问题以及我需要实现的目标。为此,我有以下XML:多行项目需要XSLT,xslt,Xslt,我已经在这里尝试了很多关于堆栈溢出的方法,但是我仍然面临同样的问题 让我试着解释一下我的问题以及我需要实现的目标。为此,我有以下XML: <authorizationGroups> <authorizationGroup> <!-- can be multiple --> <name>OGroup 1</name> <application>
<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(), ', ')"/>
或者将其作为一种逃避,包括在类似未经测试的:
<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(), ', ')"/>
问题是,我认为,您正在迭代名称元素,就像这样
<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函数,四个而不是两个——你让我很开心。非常感谢你!