XSLT如何按id合并两个group节点内容到同一个KML Folder
解决方案
你的判断是正确的:XSLT为流式输出,一旦Entryway对应的Folder节点输出完成,就无法再追加内容,因此需要调整处理逻辑,有两种常用实现方式:
方案1:调整上层节点选择逻辑(推荐)
将两个需要合并的特殊group和普通group分开处理,修改你原来的apply-templates代码:
<!-- 先处理所有不需要合并的普通group --> <xsl:apply-templates select="ds:group[not(ds:id='Route' or ds:id='Entryway')]"> <xsl:sort select="ds:display_name"/> </xsl:apply-templates> <!-- 单独生成合并后的Accessible Folder --> <Folder id="Accessible"> <name>Accessible Features</name> <!-- 加载Entryway组下的所有item --> <xsl:apply-templates select="ds:group[ds:id='Entryway']/ds:item"> <xsl:sort select="ds:name"/> </xsl:apply-templates> <!-- 加载Route组下的所有item --> <xsl:apply-templates select="ds:group[ds:id='Route']/ds:item"> <xsl:sort select="ds:name"/> </xsl:apply-templates> </Folder>
对应的ds:group模板可以简化,只保留普通group的处理逻辑即可:
<xsl:template match="ds:group"> <Folder id="{ds:id}"> <name> <xsl:value-of select="ds:display_name"/> </name> <xsl:apply-templates select="ds:item"> <xsl:sort select="ds:name"/> </xsl:apply-templates> </Folder> </xsl:template>
方案2:保留原有调用逻辑,修改group模板
如果不想调整上层的apply-templates选择规则,可以直接修改你现有的group模板,处理Entryway组时主动加载Route组的item,Route组直接跳过输出:
<xsl:template match="ds:group"> <xsl:choose> <xsl:when test="not(ds:id = 'Route') and not(ds:id = 'Entryway')"> <Folder id="{ds:id}"> <name> <xsl:value-of select="ds:display_name"/> </name> <xsl:apply-templates select="ds:item"> <xsl:sort select="ds:name"/> </xsl:apply-templates> </Folder> </xsl:when> <xsl:when test="ds:id = 'Entryway'"> <Folder id='Accessible'> <name> <xsl:value-of select="ds:display_name"/> </name> <!-- 处理当前Entryway的item --> <xsl:apply-templates select="ds:item"> <xsl:sort select="ds:name"/> </xsl:apply-templates> <!-- 额外加载Route组的所有item --> <xsl:apply-templates select="../ds:group[ds:id='Route']/ds:item"> <xsl:sort select="ds:name"/> </xsl:apply-templates> </Folder> </xsl:when> <!-- Route组直接跳过,不生成任何输出 --> <xsl:when test="ds:id = 'Route'"/> <xsl:otherwise/> </xsl:choose> </xsl:template>
补充说明
你之前尝试的匹配语法ds:id='Route' | ds:id='Entryway'语法错误,正确的节点匹配写法是ds:group[ds:id='Route' or ds:id='Entryway'],但这种写法会让两个group分别触发模板两次,依然会生成两个Folder,无法满足合并需求。
注意确认你的XSLT根节点已经声明了命名空间xmlns:ds="http://ws.wso2.org/dataservice",否则节点选择逻辑会失效。
内容的提问来源于stack exchange,提问作者GeorgeIV
相关产品推荐
相关产品推荐

