【发布时间】:2016-09-13 00:51:04
【问题描述】:
我需要 xsl 模板,对于指定“路径”下的指定“元素类型”,属性“名称”值与“旧值”匹配,将用“新值”替换“旧值”
我创建了对“element_type”、“old_value”、“new_value”参数进行适当处理的 xsl 模板。我堆叠了处理“路径”参数。 下面是输入xml
<?xml version="1.0" encoding="utf-8"?>
<storage name="hdd1">
<folder name="root">
<folder name="sub1">
<folder name="sub1-sub">
<file name="temp-docs"/>
<folder name="temp-docs"/>
<folder name="temp-pictures"/>
</folder>
</folder>
<folder name="sub2">
<folder name="temp-docs">
<folder name="inner-temp-bar"/>
</folder>
<folder name="temp-pictures"/>
</folder>
</folder>
<folder name="temp-docs"/>
<folder name="temp-pictures"/>
</storage>
接下来是设计XSL:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="element_type"/>
<xsl:param name="path"/>
<xsl:param name="old_value"/>
<xsl:param name="new_value"/>
<xsl:template match="/ | * | @*">
<xsl:copy>
<xsl:apply-templates select="* | @* | text()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:choose>
<xsl:when test="contains(., $old_value)
and local-name() = 'name'
and name(..) = $element_type
and ancestor::*[2]/@name = $path">
<xsl:attribute name="name">
<xsl:value-of select="substring-before(., $old_value)"/>
<xsl:value-of select="$new_value"/>
<xsl:value-of select="substring-after(., $old_value)"/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="* | @* | text()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
对于输入参数:
'element_type' = 'folder'
'old_value' = 'temp-'
'new_value' = ''
'path'= 'sub2'
上述 XML 结果的 XSL 应用程序是(重命名所有“文件夹”元素,但不是名称为“inner-temp-bar”的“文件夹”元素):
<?xml version="1.0" encoding="UTF-8"?>
<storage name="hdd1">
<folder name="root">
<folder name="sub1">
<folder name="sub1-sub">
<file name="temp-docs"/>
<folder name="temp-docs"/>
<folder name="temp-pictures"/>
</folder>
</folder>
<folder name="sub2">
<folder name="docs">
<folder name="inner-temp-docs"/>
</folder>
<folder name="pictures"/>
</folder>
</folder>
<folder name="temp-docs"/>
<folder name="temp-pictures"/>
</storage>
目标是重命名指定路径下的所有文件夹和子文件夹,例如:
- 'path' = 'root/sub2' 将重命名 'sub2' 元素内的所有 'folder' 元素;
- 'path' = 'root' 将重命名 'sub1' 和 'sub2' 元素内的所有 'folder' 元素。
我需要如何处理“路径”参数以实现上述目标?
【问题讨论】:
-
您的样式表有
version="1.0",但您的问题被标记为xslt-2.0。请说明您是否使用 XSLT 2.0 处理器,因为这肯定会使编码更容易。 -
抱歉,打印错误,更新到 xslt-2.0