2012-02-24 2 views
3

XSLTを使用して、ファイル内の一部のノードから不要な属性を削除しています。XSLTを使用しているときにエスケープ文字の値を保持するにはどうすればよいですか?

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

はしかし、私はいくつかのノードは、その属性値に含まれるエスケープ文字を失うしていることを発見した:変換すべきではないノードは、以下の単純なテンプレートを使用します。例えば

、この入力:

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/> 

最後までこのように見える:

<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/> 

は、どのように私は、この不要な変換を防ぐことができますか?

答えて

3

I.のXSLT 1.0ソリューション

だけxsl:outputにこの属性を追加します。

encoding="us-ascii" 

これは、その文字コードでレンダリングされる任意の非ASCII文字が発生します。 (もちろん、これら3の全てが、同じ文字列の異なるだけrepresenatationsをしている、

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/> 

<field value="Lei Complementar No. 116/2003, Art. 6, &#xA7; 2&#xBA;, I." /> 

そして:

しかし、あなたはまだのような異なる出力を、得ることができますユニコード)文字。

II。 XSLT 2.0溶液

これは<xsl:character-map>命令を使用して、常に同じ出力生成しなければならない:

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/> 

:この変換が提供されるXML文書に印加されたとき

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" 
    indent="yes" use-character-maps="chmEscapes"/> 

<xsl:character-map name="chmEscapes"> 
    <xsl:output-character character="&#167;" 
         string="&amp;#167"/> 
    <xsl:output-character character="&#186;" 
         string="&amp;#186"/> 
</xsl:character-map> 

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

を所望の正しい結果が得られる

<field value="Lei Complementar No. 116/2003, Art. 6, &#167 2&#186, I."/> 
関連する問題