我的XML如下所示:
<pi:Additional_Information>
<pi:Allocation_Cost_Center_1 > test value cost 1 </pi:Allocation_Cost_Center_1>
<pi:Allocation_Cost_Center_2 > test value cost 2 </pi:Allocation_Cost_Center_2>
<pi:Allocation_Cost_Center_3 > test value cost 3 </pi:Allocation_Cost_Center_2>
<pi:Allocation_Cost_Center_4 > test value cost 4 </pi:Allocation_Cost_Center_2>
<pi:Allocation_Region_1 >test value region 1</pi:Allocation_Region_1>
<pi:Allocation_Region_2 >test value region 2</pi:Allocation_Region_2>
<pi:Allocation_Region_3 >test value region 3</pi:Allocation_Region_3>
<pi:Allocation_Region_4 >test value region 4</pi:Allocation_Region_4>
<pi:Allocation_Location_1>Berlin</pi:Allocation_Location_1>
<pi:Allocation_Location_2>Berlin</pi:Allocation_Location_2>
<pi:Allocation_Location_3>Berlin</pi:Allocation_Location_3>
<pi:Allocation_Location_4>Berlin</pi:Allocation_Location_4>
</pi:Additional_Information>
我需要遍历所有以第一个循环中的一个结尾的标记,在下一个循环中所有标记以2结尾,依此类推......
我正在使用XSLT 2.0。预期产出如下:
(第一排)
测试值成本1测试值区域1柏林
(第二行)
测试值成本2测试值区域2柏林
(第三行)
测试值成本3测试值区域3柏林
(第四行)
测试值成本4测试值区域4柏林
提前致谢。
答案 0 :(得分:1)
这是你可以看到它的另一种方式:
<xsl:template match="/pi:Additional_Information">
<xsl:variable name="nodes" select="*" />
<xsl:variable name="rows" select="count($nodes) div 3" />
<xsl:for-each select="0 to $rows - 1">
<xsl:value-of select="$nodes[(position() - 1) mod $rows = current()]"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
这假设总有3种类型的节点(因此每行3个值),并且它们按类型和行排序。
否则你可以使用:
<xsl:template match="pi:Additional_Information">
<xsl:for-each-group select="*" group-by="tokenize(name(), '_')[last()]">
<xsl:value-of select="current-group()"/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>
这会按照名称中最后一个下划线之后的内容对节点进行分组。
答案 1 :(得分:0)
在XSLT 2.0中:
<xsl:template match="pi:Additional_Information">
<xsl:for-each-group select="*" group-by="replace(name(), '[A-Za-z_]', '')">
<loop index="{current-grouping-key()}">
<xsl:apply-templates select="current-group()"/>
</loop>
</xsl:for-each-group>
</xsl:template>