我有一个像下面这样的xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<properties>
<entry key="user">1234</entry>
<entry key="docname">abc.pdf</entry>
</properties>
我想将从java代码传递的值附加到docname标记中的文件名,并使用xslt将其转换为新的xml文件,输出xml应该是这样的
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<properties>
<entry key="user">1234</entry>
<entry key="docname">abc_1.pdf</entry>
</properties>
我正在使用下面的xslt。参数id是从java代码传递的。
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:param name="id"/>
<xsl:variable name="newName" select="/properties/entry[@key='docname']"/>
<xsl:template match="entry[@key='docname']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="replace($newName, $newName, $id)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
上面的xslt正在替换docname标记中的值。我想在扩展名(abc_1.pdf)之前附加带下划线的id,而不是替换整个值。 有人可以帮我这个..
答案 0 :(得分:1)
如果只有一个点&#39;它取决于输入数据的复杂性。&#39;在那些文件名中,你可以简单地做
<xsl:value-of select="concat(substring-before(., '.'), '_', $id, '.', substring-after(., '.'))"/>
或使用
<xsl:value-of select="replace(., '\.\w+$', concat('_', $id, '$0'))"/>
使用_
,$id
和后缀的串联替换末尾的后缀。