ฉันจะทำให้ XSLT ทำงานใน Chrome ได้อย่างไร


88

ฉันมีเอกสาร XML ที่นี่ที่เสิร์ฟพร้อมกับสอดคล้องไฟล์ XSL การแปลงจะถูกเรียกใช้งานฝั่งไคลเอ็นต์โดยไม่ต้องใช้ JavaScript

ใช้งานได้ดีใน IE (ช็อตสยอง) แต่ใน Google Chrome จะแสดงโหนดข้อความของเอกสารเท่านั้น

ฉันรู้ว่าเป็นไปได้ที่จะทำ XSL ฝั่งไคลเอ็นต์ใน Chrome ดังที่ฉันได้เห็นตัวอย่างแล้ว แต่ฉันยังไม่สามารถทำซ้ำความสำเร็จนี้ได้ด้วยตัวเอง

ผมทำอะไรผิดหรือเปล่า?


จะเป็นการดีที่จะโพสต์วิธีแก้ปัญหาเมื่อคุณทราบ ฉันไม่ได้ใช้ Chrome เพื่ออะไรที่จริงจัง - ดูเหมือนว่าเป็น Google-toy สำหรับฉัน เหตุใดคุณจึงต้องดำเนินการฝั่งไคลเอ็นต์ XSLT
Dimitre Novatchev

ฉันไม่. ฉันแค่คิดว่ามันจะค่อนข้างเรียบร้อย และฉันก็ยังอยากรู้ว่าทำไมบางอย่างถึงใช้ได้กับ Chrome แต่ของฉันทำไม่ได้ โอ้และสำหรับผู้ใช้ IE ขออภัยสำหรับรูปแบบสีรุ้งที่โหดร้ายของหน้า
Eric

12
สำหรับฉัน Chrome สามารถทำการเปลี่ยนแปลงได้ก็ต่อเมื่อเปิด XML ผ่าน http: // มันไม่ทำงานเมื่อทำงานผ่านไฟล์: // แอตทริบิวต์ xmlns ไม่ได้สร้างความแตกต่างให้ฉัน
Jaroslav Záruba

ข้อผิดพลาดนี้กล่าวถึงที่นี่
Flavio Cysne

1
ข้อบกพร่องของ Chrome ที่แท้จริงสำหรับสิ่งนี้อยู่ที่code.google.com/p/chromium/issues/detail?id=111905
Grant Peters

คำตอบ:


116

คำตอบอื่น ๆ ด้านล่างของ Eric ไม่ถูกต้อง การประกาศเนมสเปซที่เขากล่าวถึงไม่มีส่วนเกี่ยวข้องกับปัญหา

เหตุผลที่แท้จริงมันไม่ได้ทำงานเนื่องจากความกังวลด้านความปลอดภัย (cf ปัญหา 4197 , ปัญหา 111905 )

ลองนึกภาพสถานการณ์นี้:

  1. คุณได้รับข้อความอีเมลจากผู้โจมตีที่มีหน้าเว็บเป็นไฟล์แนบซึ่งคุณดาวน์โหลด

  2. คุณเปิดหน้าเว็บท้องถิ่นในเบราว์เซอร์ของคุณ

  3. หน้าเว็บในท้องถิ่นสร้าง<iframe>ที่มีแหล่งที่มาเป็นhttps://mail.google.com/mail/

  4. เนื่องจากคุณลงชื่อเข้าใช้ Gmail เฟรมจึงโหลดข้อความในกล่องจดหมายของคุณ

  5. frames[0].document.documentElement.innerHTMLหน้าเว็บท้องถิ่นอ่านเนื้อหาของกรอบโดยใช้จาวาสคริปต์ในการเข้าถึง (หน้าเว็บออนไลน์ไม่สามารถดำเนินการขั้นตอนนี้ได้เนื่องจากมาจากแหล่งที่มาที่ไม่ใช่ Gmail นโยบายที่มาเดียวกันจะทำให้การอ่านล้มเหลว)

  6. หน้าเว็บภายในจะวางเนื้อหาในกล่องจดหมายของคุณลงใน a <textarea>และส่งข้อมูลผ่านแบบฟอร์ม POST ไปยังเว็บเซิร์ฟเวอร์ของผู้โจมตี ขณะนี้ผู้โจมตีมีกล่องจดหมายของคุณซึ่งอาจเป็นประโยชน์สำหรับการส่งสแปมหรือระบุการโจรกรรม

Chrome ขัดขวางสถานการณ์ข้างต้นโดยกำหนดข้อ จำกัด เกี่ยวกับไฟล์ในเครื่องที่เปิดโดยใช้ Chrome เพื่อเอาชนะข้อ จำกัด เหล่านี้เรามีสองวิธี:

  1. ลองเรียกใช้ Chrome ด้วย--allow-file-access-from-files แฟล็ก ฉันไม่ได้ทดสอบด้วยตัวเอง แต่ถ้ามันใช้งานได้ตอนนี้ระบบของคุณจะเสี่ยงต่อสถานการณ์ในลักษณะที่กล่าวถึงข้างต้น

  2. อัปโหลดไปยังโฮสต์และแก้ไขปัญหา


2
นี่เป็นเรื่องจริง แต่นั่นไม่ใช่สาเหตุเดียวของปัญหา ฉันติดตามรายงาน "ข้อบกพร่อง"มาระยะหนึ่งแล้ว อย่างไรก็ตามฉันไม่สามารถทำให้มันทำงานฝั่งเซิร์ฟเวอร์ได้หากไม่มีxmlnsแอตทริบิวต์ สิ่งนี้อาจมีการเปลี่ยนแปลงใน Chrome เวอร์ชันใหม่กว่า
Eric

4
@Eric ตกลงนี่อาจไม่ใช่คำตอบสำหรับปัญหาของคุณ แต่เป็นคำตอบที่ถูกต้องสำหรับคำถามของคุณ เมื่อพิจารณาจากความคิดเห็นของผู้เยี่ยมชมหน้านี้เราจะเห็นว่าคำตอบที่ได้รับการทำเครื่องหมายคำตอบนั้นไม่สามารถแก้ปัญหาได้ (ไม่งั้นทำไมต้องลุยอีก 6 คำตอบเพื่อหาทางแก้)
Pacerier

4
@Pacerier: ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามของฉัน คำถามของฉันคือถามเกี่ยวกับสาเหตุที่เอกสารสองชุดที่โฮสต์บนเซิร์ฟเวอร์ของฉันไม่ได้รับการแปลงอย่างถูกต้อง ปัญหาด้านความปลอดภัยในขณะที่ควรทราบไม่เกี่ยวข้องกับคำถามนี้
Eric

1
@Pacerier ขอบคุณ--allow-file-access-from-filesทำงานได้ดี
Ibn Saeed

1
ข้อ จำกัด ของ Chrome เกี่ยวกับไฟล์: // เป็นเรื่องงี่เง่าและ devs ก็ขี้เกียจเกินไปที่จะใช้นโยบายต้นกำเนิดเดียวกันอย่างถูกต้อง (เช่นเดียวกับ Firefox) และนั่นเป็นเรื่องที่น่าเสียดายเพราะ Chrome เป็นเบราว์เซอร์ประจำวันของฉัน
v1nce

14

ในขณะที่เขียนมีข้อบกพร่องใน chromeซึ่งจำเป็นต้องมีxmlnsแอตทริบิวต์เพื่อเรียกการแสดงผล:

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

นี่คือปัญหาที่ผมทำงานในเมื่อให้บริการไฟล์ XML จากเซิร์ฟเวอร์


หากไม่เหมือนกับฉันคุณกำลังดูไฟล์ xml จากfile:///urlดังนั้นโซลูชันที่กล่าวถึง--allow-file-access-from-filesคือสิ่งที่คุณต้องการ


2
หาดี! เติมเต็มข้อบกพร่องสำหรับสิ่งนี้
Mohamed Mansour

1
@Peter: ขึ้นอยู่กับเอกสารป้อนข้อมูลของคุณ ข้อมูลจำเพาะ XSLT ค่อนข้างชัดเจนที่นี่และ IE ก็ให้อภัยเกินไป หากอินพุตเป็น XHTML ที่ถูกต้องแสดงว่ามีการประกาศเนมสเปซ ในการให้ XSLT ค้นหาสิ่งใด ๆ ในเอกสารอินพุตนั้นคุณต้องกำหนดเนมสเปซ อย่างไรก็ตามไม่จำเป็นต้องใช้เนมสเปซเริ่มต้น (แต่ง่ายที่สุด)
Abel

10
@ เอริก: ดูคำตอบของฉันไม่มีความผิด แต่คำตอบของคุณผิด
Pacerier

4
นี่ไม่ใช่คำตอบ (หรือวิธีแก้ปัญหาและ "... " ก็ค่อนข้างคลุมเครือ) Pacerier เป็นคำตอบที่ถูกต้อง
RedGlyph

สิ่งนี้ไม่ถูกต้อง ไม่จำเป็นต้องชะลอตัว มันขอหมายเลขรุ่น
UDID

7

ปัญหาที่เกิดขึ้นบนพื้นฐานของChromeไม่ได้เกี่ยวกับnamespace XMLxmlns="http://www.w3.org/1999/xhtml"ซึ่งเป็น หากไม่มีแอตทริบิวต์ namesspace ก็จะใช้กับ IE ไม่ได้เช่นกัน

เนื่องจากข้อ จำกัด ด้านความปลอดภัยคุณต้องเพิ่ม--allow-file-access-from-filesแฟล็กเมื่อคุณเริ่ม Chrome ฉันคิดว่าผู้ใช้ linux / * nix สามารถทำได้อย่างง่ายดายผ่านเทอร์มินัล แต่สำหรับผู้ใช้ windows คุณต้องเปิดคุณสมบัติของทางลัด Chromeและเพิ่มในปลายทางเป้าหมายดังต่อไปนี้

คลิกขวา -> คุณสมบัติ -> เป้าหมาย

ใส่คำอธิบายภาพที่นี่

นี่คือตัวอย่างเส้นทางแบบเต็มพร้อมแฟล็กที่ฉันใช้บนเครื่องของฉัน

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

ฉันหวังว่าการแสดงทีละขั้นตอนนี้จะช่วยให้ผู้ใช้ windows พบปัญหานี่คือเหตุผลที่ฉันเพิ่มโพสต์นี้


6

ฉันมีปัญหาเดียวกันกับ localhost วิ่งไปทั่วอินเทอร์เน็ตเพื่อค้นหาคำตอบและฉันอนุมัติการเพิ่ม--allow-file-access-from-filesผลงาน ฉันทำงานบน Mac ดังนั้นสำหรับฉันฉันต้องผ่านเทอร์มินัลsudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-filesและป้อนรหัสผ่านของคุณ (ถ้าคุณมี)

สิ่งเล็ก ๆ อีกอย่าง - จะไม่มีอะไรทำงานได้เว้นแต่คุณจะเพิ่มไฟล์. xml ของคุณโดยอ้างอิงไปยังไฟล์. xsl ของคุณดังต่อไป<?xml-stylesheet type="text/xsl" href="<path to file>"?>นี้ สิ่งเล็ก ๆ อีกอย่างที่ฉันไม่รู้ในทันที - คุณควรเปิดไฟล์. xml ในเบราว์เซอร์ไม่ใช่. xsl


4

มันจะไม่ทำงานถ้าไฟล์ XML (เริ่มต้นด้วย PI มาตรฐาน:

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

สำหรับการอ้างอิงสไตล์ชีต XSL) จะทำหน้าที่เป็น "application / xml" ในกรณีนี้ Chrome จะยังคงดาวน์โหลดสไตล์ชีต XSL ที่อ้างถึง แต่จะไม่มีการแสดงผลเนื่องจากจะเปลี่ยนประเภทเอกสารจาก "application / xml" เป็น "Document" (! ??) และ "text / xsl" เป็น "อย่างเงียบ ๆ Stylesheet "(! ??) จากนั้นจะพยายามแสดงเอกสาร XML ราวกับว่าเป็นเอกสาร HTML (5) โดยไม่ต้องเรียกใช้โปรเซสเซอร์ XSLT ก่อน และไม่มีอะไรเลยจะแสดงในหน้าจอ (ซึ่งเนื้อหาจะยังคงแสดงหน้าก่อนหน้าซึ่งอ้างอิงถึงหน้า XML และจะหมุนไอคอนต่อไปราวกับว่าเอกสารไม่เคยโหลดอย่างสมบูรณ์

คุณสามารถใช้คอนโซล Chrome ได้อย่างสมบูรณ์แบบซึ่งแสดงว่ามีการโหลดทรัพยากรทั้งหมด แต่ถูกตีความไม่ถูกต้อง

ใช่ปัจจุบัน Chrome แสดงผลเฉพาะไฟล์ XML เท่านั้น (พร้อมการประกาศ XSL สไตล์ชีตชั้นนำที่เป็นทางเลือก) เฉพาะในกรณีที่ทำหน้าที่เป็น "text / xml" แต่ไม่ใช่ "application / xml" เท่าที่ควรสำหรับ XML ที่แสดงผลฝั่งไคลเอ็นต์ด้วย การประกาศ XSL

สำหรับไฟล์ XML ที่ทำหน้าที่เป็น "text / xml" หรือ "application / xml" และไม่มีการประกาศสไตล์ชีต XSL Chrome ควรยังคงใช้สไตล์ชีตเริ่มต้นเพื่อแสดงเป็นแผนผัง DOM หรืออย่างน้อยก็เป็นแหล่งข้อความ แต่มันไม่เป็นเช่นนั้นและที่นี่อีกครั้งพยายามที่จะแสดงผลราวกับว่ามันเป็น HTML และบั๊กทันทีในหลายสคริปต์ (รวมถึงสคริปต์ภายในเริ่มต้น) ที่พยายามเข้าถึง "document.body" เพื่อจัดการเหตุการณ์ onLoad และฉีดจาวาสคริปต์ ตัวจัดการในนั้น

ตัวอย่างไซต์ที่ไม่ทำงานตามที่คาดไว้ (เอกสาร Common Lisp) ใน Chrome แต่ทำงานใน IE ซึ่งรองรับ XSLT ฝั่งไคลเอ็นต์:

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

หน้าดัชนีด้านบนนี้แสดงอย่างถูกต้อง แต่ลิงก์ทั้งหมดจะขับเคลื่อนไปยังเอกสาร XML ด้วยการประกาศ XSL พื้นฐานไปยังเอกสารสไตล์ชีต XSL ที่มีอยู่และคุณสามารถรอได้โดยไม่มีกำหนดโดยคิดว่าบทมีปัญหาในการดาวน์โหลด สิ่งที่คุณสามารถทำได้เพื่ออ่าน docuemntation คือเปิดคอนโซลและอ่านซอร์สโค้ดในแท็บทรัพยากร


3

อย่างที่บอก Chrome กำลังมองหาส่วนหัว

ประเภทเนื้อหา: ข้อความ / xml

จากนั้นใช้งานได้ - การทำซ้ำอื่น ๆ ล้มเหลว

ตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์ของคุณให้บริการนี้ นอกจากนี้ยังอธิบายว่าเหตุใดจึงล้มเหลวสำหรับไฟล์ file: // URI xml


2

ตรวจสอบhttp://www.aranedabienesraices.com.ar

ไซต์นี้สร้างด้วยฝั่งไคลเอ็นต์ XML / XSLT ทำงานบน IE6-7-8, FF, O, Safari และ Chrome คุณส่งส่วนหัว HTTP อย่างถูกต้องหรือไม่ คุณเคารพนโยบายที่มาเดียวกันหรือไม่?


ดูคำตอบของฉันฉันได้แก้ไขแล้ว ดูเหมือนว่า Chrome จะต้องการxmlnsแอตทริบิวต์
Eric

4
ฉันไม่คิดอย่างนั้น ในการดำเนินการเปลี่ยนแปลง Chrome ไม่จำเป็นต้องตั้งค่าเนมสเปซเริ่มต้นเป็น XHTML namespace ในการเรนเดอร์ XHTML จำเป็นต้องมี XHTML ที่เหมาะสมแน่นอน คุณกำลังผสมสิ่งต่างๆ

ไซต์ที่อ้างถึงข้างต้นไม่ได้สร้างด้วย XML แต่ใช้ XHTML ทั้งสองไม่เหมือนกัน (ทั้งสองเป็น XML แต่อีกอันหนึ่งยังเป็น HTML และอีกอันไม่เหมือนกัน)
jerseyboy


1

สิ่งที่เอริคพูดนั้นถูกต้อง

ใน xsl สำหรับแท็ก xsl: stylesheet มีแอตทริบิวต์ต่อไปนี้

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

ทำงานได้ดีในโครเมี่ยม


1

ฉันเริ่มทดสอบสิ่งนี้และพบปัญหาความปลอดภัยของไฟล์ / Chrome ในเครื่อง วิธีแก้ปัญหาง่ายๆคือใส่ไฟล์ XML และ XSL ในโฟลเดอร์สาธารณะ Dropbox และรับลิงก์ไปยังไฟล์ทั้งสอง ใส่ลิงก์ไปยังการแปลง XSL ในส่วนหัว XML ใช้ลิงก์ XML ใน Chrome แล้วได้ผล!


1

หลังจาก 8 ปีสถานการณ์จะเปลี่ยนไปเล็กน้อย

ฉันไม่สามารถเปิดเซสชันใหม่ของ Google Chrome โดยไม่มีพารามิเตอร์อื่นและอนุญาตสคีมา "file:"

บน macOS ฉันทำ:

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

หากไม่มีข้อโต้แย้งนี้ฉันไม่สามารถทดสอบ XSL สไตล์ชีตในเครื่องได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.