2012-05-03 58 views
6

我試圖做一些看起來應該很簡單的事情,但我無法得到它的工作,我似乎無法找到任何示例不涉及許多不相關的東西。 我想將特定XML標籤的文本內容更新爲特定值(作爲參數傳入,此XSLT將從螞蟻中使用)。一個簡單的例子:更新基於參數的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> 
沒有文本

在此先感謝!

回答

10

有許多的與所提供的代碼中的問題,其導致編譯時錯誤:

<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

<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> 
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> 
+0

我試過(都在我的稍微複雜點的例子,並在[基本示例](http://www.xsltcake.com/slices/Y8fojh/4)),但似乎沒有工作?我得到一個空的foo標籤。我複製了錯誤的東西嗎? – user1126518

+0

Sean提供的「XSLT代碼」會導致任何兼容的XSLT 1.0處理器發生編譯時錯誤。 –

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>