我有以下树文件结构:
ROOT (ID 0000)
- FILE 1 (ID 0001)
- FILE 2 (ID 0002)
- - FILE 2.1 (ID 0003)
- - FILE 2.2 (ID 0004)
- - - FILE 2.2.1 (ID 0005)
- FILE 3 (ID 0006)
所有这些都是具有以下结构的XML文件:
<asset id="0002" name="FILE 2">
<child_asset_rel child_asset="0003"/>
<child_asset_rel child_asset="0004"/>
</asset>
因此,如果主元素有子元素,则只显示元素<child_asset_rel>
。我们还可以看到,在XML中我们只能检测资产的“直接子节点”,即每个文件都不知道它是否具有孙子,因此我们必须在每个文件中查找子节点。
输入是根文件的XML。它如下:
<asset id="0000" name="ROOT">
<child_asset_rel child_asset="0001"/>
<child_asset_rel child_asset="0002"/>
<child_asset_rel child_asset="0006"/>
</asset>
我还有一个函数get-asset('ID')
,它返回资产的XML文件,其中包含我们作为参数传递的ID。
Ex:get-asset(0002)将返回上面的XML示例。
我想要的是获取显示完整路径的资产名称列表,如下所示:
<file href="FILE 1"/>
<file href="FILE 2/FILE 2.1"/>
<file href="FILE 2/FILE 2.2/FILE 2.2.1"/>
<file href="FILE 3"/>
正如您在上面的示例中所看到的,根元素不能包含在路径中。
我尝试了很多解决方案,但似乎无法得到我想要的结果。我尝试在递归函数中使用for-each
,但结果不是预期的结果。
答案 0 :(得分:0)
以下是模板大纲:
<xsl:template match="asset[@name = 'ROOT']" priority="5">
<xsl:apply-templates select="child_asset_rel/get-asset(@child_asset)">
<xsl:with-param name="path" select="''"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="asset[child_asset_rel]">
<xsl:param name="path" select="concat($path, @name, '/')"/>
<xsl:apply-templates select="child_asset_rel/get-asset(@child_asset)">
<xsl:with-param name="path" select="$path"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="asset[not(child_asset_rel)]">
<xsl:param name="path"/>
<file href="{$path}{@name}"/>
</xsl:template>
未经测试,因为您没有提供样本数据和示例代码进行测试,但应该给您一个想法。