使用基于param的XSLT更新元素的文本

时间:2012-05-03 11:27:12

标签: xslt

我正在尝试做一些看起来应该非常简单的事情,但我无法让它发挥作用,而且我似乎无法找到任何不涉及许多不相关的事情的例子。 我想将特定xml标记的文本内容更新为特定值(作为参数传入,将从ant使用此XSLT)。一个简单的例子:

我想转型

<foo>
  <bar>
    baz
  </bar>
</foo>

<foo>
    <bar>
        something different
    </bar>
</foo>

这是我尝试过的样式表,只会产生标签,而不会产生任何文字

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- identity transformation, to keep everything unchanged except for the stuff we want to change -->
    <!-- Whenever you match any node or any attribute -->
    <xsl:template match="node()|@*">
        <!-- Copy the current node -->
        <xsl:copy>
            <!-- Including any attributes it has and any child nodes -->
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- change the text of the bar node, in the real template the value won't be specified inline -->
    <xsl:template match="/foo/bar/">
        <xsl:param name="baz" value="something different"/>
            <xsl:value-of select="$baz"/>
    </xsl:template>
</xsl:stylesheet>

提前致谢!

3 个答案:

答案 0 :(得分:11)

提供的代码存在许多问题导致编译时错误:

<xsl:template match="/foo/bar/"> 
    <xsl:param name="baz" value="something different"/> 
        <xsl:value-of select="$baz"/> 
</xsl:template>
  1. 此模板上指定的匹配模式在语法上是非法的 - XPath表达式不能以/字符结尾。

  2. xsl:param不能包含未知属性,例如value

  3. <强>解决方案

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:param name="pReplacement" select="'Something Different'"/>
    
     <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
     </xsl:template>
    
     <xsl:template match="foo/bar/text()">
      <xsl:value-of select="$pReplacement"/>
     </xsl:template>
    </xsl:stylesheet>
    

    在提供的XML文档上应用此转换时:

    <foo>
      <bar>
        baz
      </bar>
    </foo>
    

    产生了想要的正确结果

    <foo>
       <bar>Something Different</bar>
    </foo>
    

答案 1 :(得分:0)

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="1.0">
<xsl:output indent="yes" encoding="UTF-8" method="xml"/>
<xsl:param name="param-from-ant" as="xs:string"/>

<xsl:template match="node()|@*">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="/foo/bar">
 <xsl:value-of select="$param-from-ant"/>
</xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

略有不同的方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:param name="replace"/>

  <xsl:template match="node()|@*">
    <xsl:choose>
      <xsl:when test="text() and name(..)='bar' and name(../..)='foo'">
        <xsl:value-of select="$replace"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>