2016-07-07 58 views
0

我有一個XML文檔,我想用XSLT 1.0替換一些特殊的子字符串。我不能使用替換函數(它僅適用於XSLT 2.0)。出於這個原因,我找到了一種替代解決方案(模板string-replace-all),我試圖使用它...但沒有成功。 這是XML的例子:XSLT1.0 - 替換XML文檔中的字符串

<parent> 
    <child1>hello world!</child1> 
    <child2>example of text</child2> 
</parent> 

我想用「人」來替代「世界」。我有這樣的XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns="urn:hl7-org:v2xml" xmlns:hl7="urn:hl7-org:v2xml" exclude-result-prefixes="hl7"> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

<!--Identity template, copia tutto in uscita --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="string-replace-all"> 
    <xsl:param name="text" /> 
    <xsl:param name="replace" /> 
    <xsl:param name="by" /> 
    <xsl:choose> 
     <xsl:when test="$text = '' or $replace = '' or not($replace)" > 
      <!-- Prevent this routine from hanging --> 
      <xsl:value-of select="$text" /> 
     </xsl:when> 
     <xsl:when test="contains($text, $replace)"> 
      <xsl:value-of select="substring-before($text,$replace)" /> 
      <xsl:value-of select="$by" /> 
      <xsl:call-template name="string-replace-all"> 
       <xsl:with-param name="text" select="substring-after($text,$replace)" /> 
       <xsl:with-param name="replace" select="$replace" /> 
       <xsl:with-param name="by" select="$by" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$text" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="text()" > 
    <xsl:variable name="newtext"> 
     <xsl:call-template name="string-replace-all"> 
      <xsl:with-param name="text" select="." /> 
      <xsl:with-param name="replace" select="world" /> 
      <xsl:with-param name="by" select="guys" /> 
     </xsl:call-template> 
    </xsl:variable> 
</xsl:template> 
</xsl:stylesheet> 

輸出是

<parent> 
    <child1/> 
    <child2/> 
</parent> 

回答

4

string-replace-all的調用結果設置爲從未使用的變量newtext

只需從template match="text()"中刪除<xsl:variable name="newtext"></xsl:variable>即可。

還可以看看@ hr_117的答案:如果要將字符串world替換爲guys,則必須將它們放入'。否則搜索元素world

例如:

<xsl:template match="text()" > 
    <xsl:call-template name="string-replace-all"> 
     <xsl:with-param name="text" select="." /> 
     <xsl:with-param name="replace" select="'world'" /> 
     <xsl:with-param name="by" select="'guys'" /> 
    </xsl:call-template> 
</xsl:template> 
+0

噢,謝謝,現在它可以工作 – Carlo

2

您需要的模板參數更改爲字符串。
嘗試:

<xsl:call-template name="string-replace-all"> 
     <xsl:with-param name="text" select="." /> 
     <xsl:with-param name="replace" select="'a'" /> 
     <xsl:with-param name="by" select="'A'" /> 
    </xsl:call-template> 

,而不單引號select="a"的選擇是尋找一個元素a

+0

感謝您的答覆。我添加了'但我仍然得到相同的輸出(PS:我改變了一點我的例子,用'人'替換''''''') – Carlo