2012-04-27 6 views
1

Aわずかに異なる要件辞書には、同じ形式のままですが、成長this questionは、ローカライズされたコンテンツの部分を作成するために、XSLを使用した2

に:

<resources> 
    <text name="property.to.match"> 
     <en_US>The American translation</en_US> 
     <en_GB>The British translation</en_GB> 
     <en>The language localized, but non locale based generic translation</en> 
    </text> 
    <text name="other.property.to.match"> 
     <en>The other language localized, but non locale based generic translation</en> 
    </text 
    <text name="another.property.to.match"> 
     <en>Second generic property</en> 
    </text> 
    <text name="a.label.to.match"> 
     <en>Generic Checkbox label</en> 
    </text> 
    <text name="some.text.to.translate"> 
     <en>This text follows a static bit of text</en> 
    </text> 
</resources> 

しかし、私は一致したいと思いれる文書はより複雑です:

<html> 
    <div>Lot's of html</div> 
    <div>[property.to.match]</div> 
    <div> 
     <h1>[other.property.to.match]</h1> 
     <p><img src="x.jpg" />[another.property.to.match]</p> 
     <input type="checkbox"/>[a.label.to.match] 
     <p>Some text that shouldn't be translated followed by [some.text.to.translate] 
    </div> 
</html> 

のでマッチャは* /テキスト内の複数のテキスト文字列を検索できるようにする必要があります()開始で終わる[]が、他のノーの中で可能性がありdesと無防備なテキストのビット。再び

答えて

1

おかげでこのXSLT 1.0変換

<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="pLookupPath" select="'file:///c:/temp/delete/lookup2.xml'"/> 
    <xsl:param name="pLang" select="'en_GB'"/> 

    <xsl:key name="kLookup" match="text/*" 
     use="concat(../@name, '+', name())"/> 

    <xsl:variable name="vDict" select="document($pLookupPath)"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template name="replaceWithLookup" match= 
     "text()[contains(., '[') and contains(., ']')]"> 
     <xsl:param name="pText" select="."/> 

     <xsl:if test="string-length($pText)"> 
      <xsl:value-of select= 
      "substring-before(concat($pText, '['), '[')"/> 

      <xsl:variable name="vToken" select= 
      "substring-before(substring-after($pText, '['), ']')"/> 

     <xsl:variable name="vReplacement"> 
     <xsl:for-each select="$vDict"> 
      <xsl:value-of select= 
      "(key('kLookup', concat($vToken, '+', $pLang)) 
     | 
      key('kLookup', concat($vToken, '+', substring-before($pLang, '_'))) 
      )[1]"/> 
     </xsl:for-each> 
     </xsl:variable> 

     <xsl:choose> 
     <xsl:when test="$vReplacement"> 
      <xsl:value-of select="$vReplacement"/> 
     </xsl:when> 
     <xsl:when test="$vToken"> 
      <xsl:value-of select="concat('[', $vToken, ']')"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select= 
      "substring-after 
       ($pText, 
       substring-before(concat($pText, '['), '[') 
       )"/> 
     </xsl:otherwise> 
     </xsl:choose> 

     <xsl:if test="$vToken"> 
     <xsl:call-template name="replaceWithLookup"> 
      <xsl:with-param name="pText" select= 
      "substring-after($pText, concat('[', $vToken, ']'))"/> 
     </xsl:call-template> 
     </xsl:if> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

次のXML文書(提供1に基づいていますが、より困難と挑戦作られた上で適用される - 最後のテキストノードは2つの置換ターゲットを含む):

<html> 
    <div>Lot's of html</div> 
    <div>[property.to.match]</div> 
    <div> 
     <h1>[other.property.to.match]</h1> 
     <p> 
      <img src="x.jpg" />[another.property.to.match] 
     </p> 
     <input type="checkbox"/>[a.label.to.match]   
     <p>Some text that shouldn't be translated followed 
     by [some.text.to.translate] 
     XXX [other.property.to.match] 
     </p> 
    </div> 
</html> 

は、所望の正しい結果を生成します。

<html> 
    <div>Lot's of html</div> 
    <div>The British translation</div> 
    <div> 
     <h1>The other language localized, but non locale based generic translation</h1> 
     <p><img src="x.jpg">Second generic property 
     </p><input type="checkbox">Generic Checkbox label 
     <p>Some text that shouldn't be translated followed 
       by This text follows a static bit of text 
       XXX The other language localized, but non locale based generic translation 

     </p> 
    </div> 
</html> 
関連する問題