获取文件的路径 - 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>
未经测试,因为您没有提供用于测试的示例数据和示例代码,但应该会给您一个想法。
我有以下树形文件结构:
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>
未经测试,因为您没有提供用于测试的示例数据和示例代码,但应该会给您一个想法。