我已经在堆栈溢出上尝试了很多东西,但我仍面临同样的问题。
让我试着解释一下我的问题以及我需要实现的目标。为此,我有以下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文档部分。
我认为这是一个非常简单的动作,但经过三天的网络和堆栈溢出研究后,我还没有得到答案。
铜 安德烈亚斯
答案 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(), ', ')"/>
答案 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">