使用xslt将参数附加到标记的值

时间:2017-06-28 06:25:57

标签: xml xslt xslt-2.0

我有一个像下面这样的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,而不是替换整个值。 有人可以帮我这个..

1 个答案:

答案 0 :(得分:1)

如果只有一个点&#39;它取决于输入数据的复杂性。&#39;在那些文件名中,你可以简单地做

<xsl:value-of select="concat(substring-before(., '.'), '_', $id, '.', substring-after(., '.'))"/>

或使用

<xsl:value-of select="replace(., '\.\w+$', concat('_', $id, '$0'))"/>

使用_$id和后缀的串联替换末尾的后缀。