需要用于多行项目的XSLT
我已经在堆栈溢出上尝试了很多东西,但我仍然面临同样的问题。需要用于多行项目的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文档部分的搜索。
我认为这是一个非常简单的操作,但经过三天的研究在网络和堆栈溢出我还没有拿出一个答案。
立方米 安德烈亚斯
问题是,我认为,你正在迭代名称元素,像这样...
<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">
要么包围等(未测试的)在<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(), ', ')"/>
喜添!感谢您的回答。试用过,但问题是没有断行或逗号,但我收到的所有“身份验证功能XX”这样的事实:
辉煌 - 你让我很快乐。非常感谢你! – user1292584 2012-03-26 12:58:23