我有一个XML,显示带有字段值的字段的值,如下所示:
<data>
<currentRow>
<columnValue>usa</columnValue>
<columnValue>ma</columnValue>
<columnValue>boston</columnValue>
<columnValue>bob</columnValue>
</currentRow>
<currentRow>
<columnValue>usa</columnValue>
<columnValue>ma</columnValue>
<columnValue>boston</columnValue>
<columnValue>george</columnValue>
</currentRow>
<currentRow>
<columnValue>usa</columnValue>
<columnValue>ny</columnValue>
<columnValue>nyc</columnValue>
<columnValue>mary</columnValue>
</currentRow>
</data>
我想生成一个看起来像
的Xml<Class>
<Student>
<Country>usa</Country>
<State>ma</State>
<City>boston</City>
<name>bob</name>
<name>george</name>
</Student>
<Student>
<Country>usa</Country>
<State>ny</State>
<City>nyc</City>
<name>mary</name>
</Student>
<Class>
简而言之,我有两个问题:
任何想法我该怎么做?
答案 0 :(得分:1)
以下样式表使用 Muenchian Method 使用前3个currentRow
元素的值对columnValue
元素进行分组。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<!--Create a key grouping on the concatenated values of
country, state, and city separated by '-'-->
<xsl:key name="students-by-country-state-city"
match="currentRow"
use="concat(columnValue[1],
'-',
columnValue[2],
'-',
columnValue[3])"/>
<xsl:template match="data">
<Class>
<!--apply templates to the first item in each grouping of items -->
<xsl:apply-templates
select="currentRow[generate-id() =
generate-id(
key('students-by-country-state-city',
concat(columnValue[1],
'-',
columnValue[2],
'-',
columnValue[3]))[1]
)]"
/>
</Class>
</xsl:template>
<xsl:template match="currentRow">
<Student>
<Country>
<xsl:value-of select="columnValue[1]"/>
</Country>
<State>
<xsl:value-of select="columnValue[2]"/>
</State>
<City>
<xsl:value-of select="columnValue[3]"/>
</City>
<!-- find all of the names for this grouping -->
<xsl:for-each
select="key('students-by-country-state-city',
concat(columnValue[1],
'-',
columnValue[2],
'-',
columnValue[3]))/columnValue[4]">
<name>
<xsl:value-of select="."/>
</name>
</xsl:for-each>
</Student>
</xsl:template>
</xsl:stylesheet>