2016-07-07 27 views
0

XML文書があり、XSLT 1.0を使用して一部の特殊文字列を置換したいと考えています。私はreplace関数を使うことはできません(XSLT 2.0でのみ利用可能です)。この理由のために私は代替の解決策(テンプレートstring-replace-all)を見つけました。私はそれを使用しようとしています...しかし、成功しません。XSLT1.0 - XML文書内の文字列を置き換えます。

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

私は「男」と「世界」を置き換えたい: これはXMLの一例です。私は、この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に設定されます。

</xsl:variable>template match="text()"から削除するだけです。

また、@ hr_117の答えを見てください。worldguysに置き換える場合は、'に入れなければなりません。それ以外の場合は、要素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:私の例を少し変更し、' a 'を' world 'と' A 'を' guys 'と置き換えて) – Carlo

関連する問題