获取文件的路径 - XSLT

Getting the path of a file - XSLT

我有以下树形文件结构:

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>

这样,如果主元素有 children,元素 <child_asset_rel> 就会出现。我们还可以看到,在 XML 中我们只能检测到资产的 'direct children',即每个文件都不知道它是否具有 grandchildren, 所以我们必须在每个文件中寻找 children.

输入的是根文件的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'),它 return 是资产的 XML 文件,其中包含我们作为参数传递的 ID。

示例:get-asset(0002) 将 return 上面的 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,但结果不是预期的。

模板概要如下:

<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>

未经测试,因为您没有提供用于测试的示例数据和示例代码,但应该会给您一个想法。