2017-07-07 4 views
0

XSLT 2スタイルシートで一連の置換を行う必要があります。たとえば、私は "aaa"のすべての出現を "bbb"に、すべての "ccc"を "ddd"に置き換える必要があります。通常replace通話に関しては、私はXSLT 2チェーンが置き換えられますか?

<xsl:value-of select="replace(replace(text(), 'aaa', 'bbb'), 'ccc', 'ddd')"/> 

を持つべきであるしかし、状況は、私は、このような置換の組の数百を持っていることであり、そのために私はスーパーロングselect属性を必要としています。私は、たとえば、Pythonスクリプトで選択文字列を生成することができると思うが、それは醜いでしょう。 XSLTがより読みやすくメンテナンス可能(かつ機械操作可能)であるように、XSLTの可能性がありますか?

<xsl:replace from="aaa" to="bbb"/> 
<xsl:replace from="ccc" to="ddd"/> 
… 

ですか?

答えて

1

あなたは各用語に置き換えることができる関数を作成する必要が

XSLT 2.0

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:funct="http://something" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:template match="text()"> 
     <xsl:value-of select="funct:textreplace($replaces/replaces/rep, .)"/> 
    </xsl:template> 


    <xsl:param name="replaces"> 
     <replaces> 
      <rep from="aaa" to="bbb"/> 
      <rep from="ccc" to="ddd"/> 
     </replaces> 
    </xsl:param> 

    <xsl:function name="funct:textreplace" as="xs:string"> 
     <xsl:param name="reps" as="element(rep)*"/> 
     <xsl:param name="text" as="xs:string"/> 
     <xsl:choose> 
      <xsl:when test="not($reps)"> 
       <xsl:value-of select="$text"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="funct:textreplace($reps[position() gt 1], replace($text, $reps[1]/@from, $reps[1]/@to))"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:function> 

</xsl:stylesheet> 
関連する問題