XSLT'nin Chrome'da çalışmasını nasıl sağlayabilirim?


88

Burada , karşılık gelen bir XSL dosyasıyla sunulan bir XML belgem var . Dönüşüm, JavaScript olmadan istemci tarafında yürütülmeye bırakılmıştır.

Bu, IE'de (şok korku) iyi çalışır, ancak Google Chrome'da yalnızca belgenin metin düğümlerini görüntüler.

Örneklerini gördüğüm gibi Chrome'da istemci tarafı XSL yapmanın mümkün olduğunu biliyorum, ancak bu başarıyı henüz kendim kopyalayamam.

Neyi yanlış yapıyorum?


Çözümü bildiğiniz zaman yayınlamak harika olur. Chrome'u ciddi bir şey için gerçekten kullanmadım - bana bir google oyuncağı gibi görünüyor. Neden XSLT istemci tarafında gerçekleştirmeniz gerekiyor?
Dimitre Novatchev

Yapmıyorum. Sadece güzel olacağını düşündüm. Yine de bazı şeylerin neden Chrome'da çalıştığını ama benimkinin neden çalışmadığını bilmek istiyorum. Oh, ve IE kullanıcıları için, sayfanın korkunç gökkuşağı stili için özür dilerim.
Eric

12
Benim için Chrome dönüşümü yalnızca XML'yi http: // üzerinden açarken yapabilir, file: // ile çalışırken çalışmaz, xmlns-niteliği benim için herhangi bir fark yaratmaz.
Jaroslav Záruba

Bu hatadan burada
Flavio Cysne

Yanıtlar:


116

Eric'in aşağıdaki diğer cevabı yanlış. Bahsettiği ad alanı beyanının sorunla hiçbir ilgisi yoktu.

Çalışmamasının gerçek nedeni güvenlik endişeleridir (bkz. Sayı 4197 , sayı 111905 ).

Şu senaryoyu hayal edin:

  1. Karşıdan yüklediğiniz, ek olarak web sayfası içeren bir saldırgandan bir e-posta iletisi alırsınız.

  2. Tarayıcınızda artık yerel web sayfasını açarsınız.

  3. Yerel web sayfası <iframe>, kaynağı https://mail.google.com/mail/ olan bir tane oluşturur .

  4. Gmail'de oturum açtığınız için çerçeve, gelen kutunuzdaki iletileri yükler.

  5. Yerel web sayfası, erişim için JavaScript kullanarak çerçevenin içeriğini okur frames[0].document.documentElement.innerHTML. (Çevrimiçi bir web sayfası, Gmail dışı bir kaynaktan geleceği için bu adımı gerçekleştiremez; aynı kaynak politikası, okumanın başarısız olmasına neden olur.)

  6. Yerel web sayfası, gelen kutunuzun içeriğini <textarea>a'ya yerleştirir ve verileri bir POST formu aracılığıyla saldırganın web sunucusuna gönderir. Artık saldırganın gelen kutunuz var , bu da spam göndermek veya hırsızlığı belirlemek için yararlı olabilir.

Chrome, Chrome kullanılarak açılan yerel dosyalara kısıtlamalar getirerek yukarıdaki senaryoyu engeller . Bu kısıtlamaların üstesinden gelmek için iki çözümümüz var:

  1. Chrome'u --allow-file-access-from-files bayrakla çalıştırmayı deneyin . Bunu kendim test etmedim, ancak çalışırsa, sisteminiz artık yukarıda bahsedilen türden senaryolara karşı savunmasız olacaktır.

  2. Bir ana bilgisayara yükleyin ve sorun çözüldü.


2
Bu doğru, ancak sorunun tek nedeni bu değildi. Bir süredir "hata" raporunu takip ediyorum . Ancak, xmlnsöznitelik olmadan sunucu tarafında da çalışmasını sağlayamadım . Bu, Chrome'un daha yeni sürümlerinde değişmiş olabilir.
Eric

4
@Eric ok, bu sorunun cevabı olmayabilir ama sorunun doğru cevabı bu. Bu sayfaya gelen ziyaretçilerin yorumlarına bakılırsa, cevap olarak işaretlenen cevabın sorunlarını çözmediğini görebiliriz. (aksi halde neden bir çözüm bulmak için diğer 6 yanıtı gözden geçirmek zorunda
kalsınlar

4
@Pacerier: Sorumun doğru cevabı bu değil. Sorum, sunucumda barındırılan bir çift belgenin neden doğru şekilde dönüştürülmediğini soruyordu. Güvenlik sorunu, bilmeye değer olsa da, bu özel soruyla ilgili değildir.
Eric

1
@Pacerier Teşekkürler, iyi --allow-file-access-from-filesçalışıyor.
Ibn Saeed

1
File: // üzerindeki Chrome kısıtlamaları aptalca ve geliştiriciler aynı kökenli politikayı doğru şekilde uygulamak için çok tembel (Firefox'un yaptığı gibi) Ve bu utanç verici çünkü Chrome benim günlük tarayıcım.
v1nce

14

Yazma sırasında, kromda, oluşturmayı tetiklemek için bir öznitelik gerektiren bir hata vardı xmlns:

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" ... >

Bir sunucudan xml dosyası sunarken karşılaştığım sorun buydu .


Eğer benden farklı olarak , xml dosyasını bir file:///url'den görüntülüyorsanız , o zaman bahsedilen çözümler --allow-file-access-from-filessizin istediğiniz çözümlerdir


2
İyi bul! Bunun için bir hata doldurdu.
Mohamed Mansour

1
@Peter: girdi belgenize bağlıdır. XSLT spesifikasyonu burada oldukça açık ve IE çok bağışlayıcı. Giriş geçerli XHTML ise, bir ad alanı bildirimine sahiptir. XSLT'nin bu girdi belgesindeki herhangi bir şeyi bulmasını sağlamak için ad alanını tanımlamalısınız. Bununla birlikte, varsayılan ad alanını kullanmak gerekli değildir (ancak en kolayı).
Abel

10
@Eric: Cevabıma bir bakın, alınma ama cevabınız yanlış.
Pacerier

4
Bu cevap değil (ne de çözüm ve "..." kesinlikle biraz belirsiz), Pacerier's doğru olanı.
RedGlyph

Bu yanlış. bu yavaşlamaya gerek yok. Sürüm numaralarını soruyor.
UDID

7

Dayalı sorun Chrome ilgili değil xml ad olduğunu xmlns="http://www.w3.org/1999/xhtml". İsim-alanı niteliği olmadan, IE ile de çalışmayacaktır.

Güvenlik kısıtlaması nedeniyle --allow-file-access-from-files, kromu başlattığınızda bayrağı eklemeniz gerekir . Sanırım linux / * nix kullanıcıları bunu terminal üzerinden kolayca yapabilir ancak Windows kullanıcıları için Chrome kısayolunun özelliklerini açmanız ve aşağıdaki gibi hedef hedefe eklemeniz gerekir;

Sağ Tıklama -> Özellikler -> Hedef

görüntü açıklamasını buraya girin

Makinemde kullandığım bayraklarla birlikte örnek bir tam yol;

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files

Umarım bu adım adım, Windows kullanıcılarına sorun için yardımcı olur, bu yüzden bu yazıyı ekledim.


6

Localhost'ta da aynı sorunu yaşadım. İnternette dolaşıp cevabı aradım ve eklemenin --allow-file-access-from-filesişe yaramasını onaylıyorum . Mac üzerinde çalışıyorum, bu yüzden benim için terminalden geçmem sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-filesve şifrenizi girmem gerekiyordu (eğer varsa).

Başka bir küçük şey - .xml dosyanıza .xsl dosyanıza referansı aşağıdaki gibi eklemediğiniz sürece hiçbir şey işe yaramaz <?xml-stylesheet type="text/xsl" href="<path to file>"?>. Hemen fark etmediğim bir diğer küçük şey - .xml dosyanızı tarayıcıda açmalısınız, .xsl değil.


4

XML dosyası (standart PI ile başlayarak:

<?xml-stylesheet type="text/xsl" href="..."?>

XSL stil sayfasına başvurmak için) "application / xml" olarak sunulur. Bu durumda Chrome, başvurulan XSL stil sayfasını indirmeye devam eder, ancak belge türlerini sessizce "application / xml" den "Document" (! ??) ve "text / xsl" 'den " Biçim sayfası "(! ​​??) ve ardından XML belgesini bir HTML (5) belgesiymiş gibi, XSLT işlemcisini çalıştırmadan oluşturmaya çalışacaktır. Ve ekranda hiçbir şey görüntülenmeyecek (içeriği XML sayfasının başvurulduğu önceki sayfayı göstermeye devam edecek ve belge hiçbir zaman tam olarak yüklenmemiş gibi simgeyi döndürmeye devam edecektir.

Tüm kaynakların yüklendiğini, ancak yanlış yorumlandığını gösteren Chrome konsolunu mükemmel bir şekilde kullanabilirsiniz.

Dolayısıyla, evet, Chrome şu anda yalnızca XML dosyalarını (isteğe bağlı önde gelen XSL stil sayfası bildirimiyle) oluşturuyor, yalnızca "metin / xml" olarak sunuluyorsa, ancak istemci tarafında oluşturulan XML için olması gerektiği gibi "uygulama / xml" olarak sunulmuyorsa XSL beyanı.

"Text / xml" veya "application / xml" olarak sunulan ve XSL stil sayfası bildirimi içermeyen XML dosyaları için, Chrome bunu bir DOM ağacı olarak veya en azından metin kaynağı olarak işlemek için yine de varsayılan bir stil sayfası kullanmalıdır. Ancak bunu yapmaz ve burada yine HTML gibi oluşturmaya çalışır ve onLoad olaylarını işlemek için "document.body" dosyasına erişmeye çalışan birçok komut dosyasında (varsayılan dahili bir komut dahil) hemen hata verir ve bazı javascriptler enjekte eder içinde işleyici.

Chrome'da beklendiği gibi çalışmayan (Common Lisp belgeleri), ancak istemci tarafı XSLT'yi destekleyen IE'de çalışan bir site örneği:

http://common-lisp.net/project/bknr/static/lmman/toc.html

Yukarıdaki bu dizin sayfası doğru bir şekilde görüntüleniyor, ancak tüm bağlantılar temel bir XSL bildirimi ile mevcut bir XSL stil sayfası belgesine yönlendirilecek ve bölümlerin indirilmesi gereken sorunlar olduğunu düşünerek sonsuza kadar bekleyebilirsiniz. Dokümanı okumak için tek yapabileceğiniz konsolu açmak ve Kaynaklar sekmesindeki kaynak kodunu okumaktır.


3

Anlayabildiğim kadarıyla, Chrome başlığı arıyor

İçerik Türü: metin / xml

Sonra işe yarıyor --- diğer yinelemeler başarısız oldu.

Web sunucunuzun bunu sağladığından emin olun. Ayrıca file: // URI xml dosyaları için neden başarısız olduğunu da açıklar.


2

Http://www.aranedabienesraices.com.ar adresini kontrol edin

Bu site XML / XSLT istemci tarafı ile oluşturulmuştur. IE6-7-8, FF, O, Safari ve Chrome'da çalışır. HTTP başlıklarını doğru bir şekilde gönderiyor musunuz? Aynı menşe politikasına saygı duyuyor musunuz?


Cevabımı görün , çözdüm. Görünüşe göre Chrome bir xmlnsöznitelik gerektiriyor .
Eric

4
Ben öyle düşünmüyorum. Dönüşümü gerçekleştirmek için Chrome'un varsayılan ad alanını XHTML ad alanına ayarlaması gerekmez. Elbette XHTML'yi işlemek için uygun XHTML'ye ihtiyaç vardır. Bir şeyleri karıştırıyorsun.

Yukarıda atıfta bulunulan site XML ile değil, XHTML ile oluşturulmuştur. İkisi tamamen aynı değil (ikisi de XML ama biri de HTML, diğeri değil).
jerseyboy

1

Dosyayı wwwroot'a koymayı denedim . Dolayısıyla, Chrome'da sayfaya erişirken, bu localhost / yourpage.xml adresidir .


1

Eric'in söylediği doğru.

Xsl'de, xsl için: stylesheet etiketi aşağıdaki niteliklere sahiptir

version = "1.0" xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" xmlns = "http://www.w3.org/1999/xhtml"

Kromda gayet iyi çalışıyor.


1

Bunu test etmeye başladım ve yerel dosya / Chrome güvenlik sorunuyla karşılaştım. Çok basit bir çözüm, XML ve XSL dosyasını, örneğin Dropbox ortak klasörüne koymak ve her iki dosyanın da bağlantılarını almaktır. XML başlığına XSL dönüşümünün bağlantısını koyun. Chrome'da XML bağlantısını kullanın VE ÇALIŞIR!


1

8 yıl sonra durum biraz değişti.

Diğer parametreler olmadan yeni bir Google Chrome oturumu açamıyorum ve "dosya:" şemasına izin veremiyorum.

MacOS'ta şunları yaparım:

open -n -a "Google Chrome" --args \
    --disable-web-security \               # This disable all CORS and other security checks
    --user-data-dir=$HOME/fakeChromeDir    # This let you to force open a new Google Chrome session

Bu argümanlar olmadan XSL stil sayfasını yerel olarak test edemiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.