获取文件的路径 - XSLT

时间:2015-04-14 09:35:26

标签: xml xslt path xslt-2.0 concat

我有以下树文件结构:

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,但结果不是预期的结果。

1 个答案:

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

未经测试,因为您没有提供样本数据和示例代码进行测试,但应该给您一个想法。