我是XSLT 1.0的新手。在我的XML中的字符串元素中,我想将jar文件路径的目录部分(C:\ abc \ my.jar)更改为静态字符串并保留jar文件名($ PATH_VAR $ \ my.jar) )。
原始XML代码段如下:
<object class="someclass">
<property name="path">
<string><![CDATA[C:\abc\my.jar]]></string>
</property>
</object>
我希望转换后的XML为:
<object class="someclass">
<property name="path">
<string><![CDATA[$PATH_VAR$\my.jar]]></string>
</property>
</object>
请注意,原始路径可以是任意长度(\\ xyz \ abc或Z:\ abc \ def \ ghi),并且jar文件可以命名为任何长度。
我不确定如何解析原始路径字符串并仅更改其中的目录部分。请帮忙!
-Jeff
答案 0 :(得分:1)
在 XSLT 2.0 中轻松提取文件名 - 即 last \
分隔符之后的部分 -
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="string"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="string/text()">
<xsl:text>$PATH_VAR$\</xsl:text>
<xsl:value-of select="tokenize(., '\\')[last()]"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
这是xslt 1.0。但看起来你正在使用xslt 2.0所以它没用了=)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" cdata-section-elements="string"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="string/text()">
<xsl:choose>
<xsl:when test="substring-after(., '\')">
<xsl:call-template name="process">
<xsl:with-param name="left" select="."/>
</xsl:call-template>
</xsl:when>
<!-- no slash == no $PATH_VAR$ -->
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="process">
<xsl:param name="left"/>
<xsl:choose>
<!-- if we have at least one slash ahead - cut everything before first slash and call template recursively -->
<xsl:when test="substring-after($left, '\')">
<xsl:call-template name="process">
<xsl:with-param name="left" select="substring-after($left, '\')"/>
</xsl:call-template>
</xsl:when>
<!-- if there are no slashes ahead then we have only file name left, that's all -->
<xsl:otherwise>
<xsl:value-of select="concat('$PATH_VAR$\', $left)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>