2016-03-27 17 views
2

Bu sorun zaman zaman meydana geliyor, yani bu sorun olmadan birçok xslt dönüşümü gerçekleştirdim, sonra en son xslt dönüşümü sırasında aniden ortaya çıktı. xslt, utf-8 karakterlerini farklı bir kodlamaya dönüştürür

aşağıdaki a.html benzer bir yapıya sahip html girdi dosyalarının çok sayıda var:

<html> 
    <body> 
    <div class="wrd"> 
     <div class="wrd-id">5</div> 
     <div class="wrd-wrd">address</div> 
     <div class="wrd-ipa">əˈdres,ˈaˌdres</div> 
    </div> 
    <div class="a">...</div> 
    </body> 
</html> 

Ben şu bir sonuç almak girdi dosyalarının kodlamasını kontrol Ne zaman:

file -I a.html 
a.html: text/html; charset=utf-8 

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

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

<xsl:template match="div[@class='a']" > 
    <xsl:apply-templates select="*|node()" /> 
</xsl:template> 

</xsl:stylesheet> 

I:

aşağıdaki a.xslt benzer bir XSLT ile html dosyalarını dönüştürmek Aşağıdaki

#!/bin/bash 
xsltproc --html a.xslt a.html > b.html 

daha tam bash komut edilir: Aşağıdaki A.Ş benzer bir komut dosyası kullanmak

#!/bin/bash 
xsltproc --html a.xslt a.html \ 
| hxnormalize -x -l 1024 \ 
| sed '/^$/d' \ 
> b.html 

Ve şu sonuç b.html edinin:

<html> 
    <body> 
    <div class="wrd"> 
     <div class="wrd-id">5</div> 
     <div class="wrd-wrd">address</div> 
     <div class="wrd-ipa">ÉËdres,ËaËdres</div> 
    </div> 
    ... 
    </body> 
</html> 

Aslında, çıkışım, kopyalayıp yapıştıramayacağım birkaç baş aşağı soru işareti içeriyor. UTF-8 karakter kümesine ait giriş karakterleri başka bir şeye dönüşmüş

non UTF-8 output

aşağıdaki resme bakın. Ben şu sonucu elde dosya b.html kodlamasını kontrol ettiğinizde

:

file -I b.html 
b.html: text/html; charset=utf-8 

nasıl başka bir kodlama benim karakterleri değiştirmek için bir xslt dönüşümü önleyebiliriz?

Xsltproc komutundan "--html" seçeneğini kaldırarak GÜNCELLEME 1

, sorun giderilmiştir. Ancak hala neden emin değilim.

#!/bin/bash 
xsltproc a.xslt a.html > b.html 

GÜNCELLEME 2

girdi dosyası ASCII veya ISO-8859-1 yerine UTF-8 olarak yorumlanır görünüyor.

<head> 
    <meta charset="UTF-8"> 
    <meta http-equiv="content-type" content="text/html"> 
    </head> 

çıkış b.html hala aynı Ancak: giriş a.html aşağıdaki başlık takılmış.

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

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

</xsl:stylesheet> 

farklı xsl fark edin: çıktı hattını

Bu b oluşturur

GÜNCELLEME 3

ben güncelleme aşağıdaki için a.xslt var.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 

Belki geride burada ASCII veya ISO-8859-1 girdi dosyasını yorumlamak için kullanılır nedeni vardır: aynı sorunu ancak ilk satır ile html aşağıdaki html beyanı verir.

cevap

2

ÇÖZÜM

Xsltproc META Content-Type başlığından HTML girişi dosyalarının dosya kodlamasını alır. Böyle bir başlık mevcut değilse, dosyanın yanlış kodlandığını varsayabilir ve dosyayı okurken kasaplık edebilir.

I girdi a.html aşağıdaki başlık takılmış:

<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
</head> 

ve aşağıdaki deneme komut çalıştırmak:

#!/bin/bash 
xsltproc --html a.xslt a.html > b.html 

xslt a.xslt aşağıdaki gibidir:

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

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

</xsl:stylesheet> 

Ve b.html çıktı dosyası en son beklendiği gibi:

<html> 
    <body> 
    <div class="wrd"> 
     <div class="wrd-id">5</div> 
     <div class="wrd-wrd">address</div> 
     <div class="wrd-ipa">əˈdres,ˈaˌdres</div> 
    </div> 
    <div class="a">...</div> 
    </body> 
</html> 
+0

Teşekkür ederiz. Çok yardımcı bir cevap. – Jagger

+0

Aslında, meta bilgisi html dosyasında yoksa, girdi dosyasının kodlamasını belirlemenizi sağlayan '–encoding' parametresinin olduğunu tespit ettim. – Jagger