2016-04-14 23 views
0

入力:XSL:タグ内に値を置き換え

<Remarks>Random data## B2B## abc,controls,free text ## B2B## random data</Remarks> 

XSLは

を交換する必要があります "## B2B ## ABC、コントロール、フリーテキスト## B2B ##"

備考タグに

"value1:abc、value2:controls、value 3:フリーテキスト」

所望の出力:

<Remarks>Random data,value1:abc,value2:controls,value3:free text,random data</Remarks> 

注:## B2B##タグ内の値は未知であり、毎回を変更するには、今の私は、サンプルの値を示しました。

+0

変化する値のサンプルを私たちに提供すると便利です。今のところ、それはちょうど暗闇の中に撃っているだけです。例: 'value1'という名前の値があります。どのような価値を置き換えるべきか?その区切り文字は何ですか?これまでは、charで区切られた(おそらく '、') '## B2B ##'の文字列の間に3つの 'string'があり、別の3つの文字列のセットで置き換える必要があると仮定しています。これらの文字列はどのように構成されていますか? – zx485

+0

質問を回答した後は、大幅に変更しないでください。 –

答えて

0

常に## B2B##で区切られた正確に一つの「プレースホルダ」があるだろうと仮定すると、 正確には 3つのカンマ区切りの「トークン」が含まれていることを確認してください。

<xsl:template match="Remarks"> 
    <xsl:copy> 
     <xsl:value-of select="substring-before(., '## B2B##')" /> 

     <xsl:variable name="placeholder" select="substring-before(substring-after(., '## B2B##'), '## B2B##')" /> 
     <xsl:text> value1: </xsl:text> 
     <xsl:value-of select="substring-before($placeholder, ',')" /> 
     <xsl:text> value2: </xsl:text> 
     <xsl:value-of select="substring-before(substring-after($placeholder, ','), ',')" /> 
     <xsl:text> value3: </xsl:text> 
     <xsl:value-of select="substring-after(substring-after($placeholder, ','), ',')" /> 

     <xsl:value-of select="substring-after(substring-after(., '## B2B##'), '## B2B##')" /> 
    </xsl:copy> 
</xsl:template> 
0

この解決法はやや複雑です。 1つのテンプレートを使用してタグ間の文字列を抽出し、別のテンプレートを使用してこの文字列を区切り文字で区切ります。どの文字列が、他の文字列がマッピングを含む別のファイルにアウトソースされているかによって置き換えられます(replacement.xml)。 XSLT-1.0はRTF(結果ツリーフラグメント)を変数に戻すため、置換はテンプレート内でハードコードされます。 XSLT-2.0では、ソリューションをより柔軟にするために変数を使用できます。ここで

は、マッピングを含むreplacement.xmlです:

<?xml version="1.0" encoding="UTF-8"?> 
<replacement> 
    <r src="abc">value1</r> 
    <r src="controls">value2</r> 
    <r src="free text">value3</r> 
</replacement> 

と文字列の中に、これらのマッピングを組み込むXSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/lines/Remarks"> 
     <xsl:variable name="tagName" select="'## B2B##'" /> 
     <xsl:variable name="subStrToReplace"> 
     <xsl:call-template name="strInTag"> 
      <xsl:with-param name="str" select="text()" /> 
      <xsl:with-param name="tagName" select="$tagName" /> 
     </xsl:call-template> 
     </xsl:variable> 
     <xsl:variable name="replacementString"> 
     <xsl:call-template name="splitAndReplace"> 
      <xsl:with-param name="pText" select="$subStrToReplace" /> 
     </xsl:call-template> 
     </xsl:variable> 
     <Remarks> 
     <xsl:value-of select="concat(normalize-space(substring-before(text(),$tagName)), ',',$replacementString, normalize-space(substring-after(substring-after(text(),$tagName),$tagName)))" /> 
     </Remarks> 
    </xsl:template> 

    <xsl:template name="strInTag"> 
     <xsl:param name="str" /> 
     <xsl:param name="tagName" /> 
     <xsl:value-of select="normalize-space(substring-before(substring-after($str,$tagName),$tagName))" /> 
    </xsl:template> 

    <xsl:template name="splitAndReplace"> 
     <xsl:param name="pText"/> 
     <xsl:if test="string-length($pText) > 0"> 
     <xsl:variable name="vNextItem" select="substring-before(concat($pText, ','), ',')"/> 
     <xsl:value-of select="concat($vNextItem,':',document('replacement.xml')/replacement/r[@src = $vNextItem]/text(),',')"/> 
     <xsl:call-template name="splitAndReplace"> 
      <xsl:with-param name="pText" select="substring-after($pText, ',')"/> 
     </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
関連する問題