Làm cách nào để làm cho XSLT hoạt động trong chrome?


88

Tôi có một tài liệu XML ở đây được cung cấp với một tệp XSL tương ứng . Việc chuyển đổi được thực hiện ở phía máy khách, không có JavaScript.

Điều này hoạt động tốt trong IE (sốc kinh dị), nhưng trong Google Chrome, chỉ hiển thị các nút văn bản của tài liệu.

Tôi biết rằng có thể thực hiện XSL phía máy khách trong Chrome, như tôi đã thấy các ví dụ về nó, nhưng tôi vẫn chưa thể tự tái tạo thành công này

Tôi đang làm gì sai?


Sẽ thật tuyệt nếu bạn đăng giải pháp, khi bạn biết nó. Tôi chưa thực sự sử dụng Chrome cho bất cứ điều gì nghiêm trọng - dường như đối với tôi như một món đồ chơi của Google. Tại sao bạn cần thực hiện XSLT phía máy khách?
Dimitre Novatchev

Tôi không. Tôi chỉ nghĩ rằng nó sẽ khá gọn gàng. Và tôi vẫn muốn biết tại sao một số thứ hoạt động trên Chrome nhưng của tôi thì không. Ồ, và đối với người dùng IE, xin lỗi vì kiểu dáng cầu vồng tàn bạo của trang.
Eric

12
Đối với tôi, Chrome chỉ có thể thực hiện chuyển đổi khi mở XML qua http: //, nó không hoạt động khi làm việc qua tệp: //, thuộc tính xmlns không tạo ra sự khác biệt nào đối với tôi.
Jaroslav Záruba

Lỗi này được đề cập ở đây
Flavio Cysne

1
Lỗi thực tế của chrome cho vấn đề này là tại code.google.com/p/chromium/issues/detail?id=111905
Grant Peters

Câu trả lời:


116

Câu trả lời khác dưới đây của Eric là sai. Tuyên bố không gian tên mà anh ta đề cập không liên quan gì đến vấn đề.

Lý do thực sự mà nó không hoạt động là do lo ngại về bảo mật (xem vấn đề 4197 , số 111905 ).

Hãy tưởng tượng tình huống này:

  1. Bạn nhận được một email từ kẻ tấn công chứa một trang web dưới dạng tệp đính kèm mà bạn tải xuống.

  2. Bạn mở trang web hiện là địa phương trong trình duyệt của mình.

  3. Trang web cục bộ tạo một <iframe>nguồn có nguồn là https://mail.google.com/mail/ .

  4. Vì bạn đã đăng nhập vào Gmail nên khung sẽ tải các thư trong hộp thư đến của bạn.

  5. Trang web cục bộ đọc nội dung của khung bằng cách sử dụng JavaScript để truy cập frames[0].document.documentElement.innerHTML. (Một trang web trực tuyến sẽ không thể thực hiện bước này vì nó đến từ một nguồn gốc không phải Gmail; chính sách nguồn gốc sẽ khiến việc đọc không thành công.)

  6. Trang web cục bộ đặt nội dung trong hộp thư đến của bạn vào a <textarea>và gửi dữ liệu qua biểu mẫu POST tới máy chủ web của kẻ tấn công. Bây giờ kẻ tấn công đã có hộp thư đến của bạn , điều này có thể hữu ích cho việc gửi thư rác hoặc xác định hành vi trộm cắp.

Chrome ngăn chặn tình huống trên bằng cách đặt các hạn chế đối với các tệp cục bộ được mở bằng Chrome. Để khắc phục những hạn chế này, chúng tôi có hai giải pháp:

  1. Thử chạy Chrome với --allow-file-access-from-files cờ. Tôi chưa tự mình kiểm tra điều này, nhưng nếu nó hoạt động, hệ thống của bạn bây giờ cũng sẽ dễ bị tấn công bởi các tình huống như đã đề cập ở trên.

  2. Tải nó lên máy chủ lưu trữ và sự cố đã được giải quyết.


2
Điều này đúng, tuy nhiên đó không phải là nguyên nhân duy nhất của vấn đề. Tôi đã theo dõi báo cáo "lỗi" trong một thời gian. Tuy nhiên, tôi cũng không thể làm cho nó hoạt động phía máy chủ mà không có xmlnsthuộc tính. Điều này có thể đã thay đổi trong các phiên bản chrome mới hơn.
Eric

4
@Eric ok, đây có thể không phải là câu trả lời cho vấn đề của bạn, nhưng nó là câu trả lời chính xác cho câu hỏi của bạn. đánh giá theo nhận xét của những người truy cập trang này, chúng ta có thể thấy rằng câu trả lời đã được đánh dấu là câu trả lời không giải quyết được vấn đề của họ. (nếu không tại sao họ sẽ phải lội qua 6 câu trả lời khác để tìm một giải pháp)
Pacerier

4
@Pacerier: Đó không phải là câu trả lời chính xác cho câu hỏi của tôi. Câu hỏi của tôi là hỏi về lý do tại sao một cặp tài liệu được lưu trữ trên máy chủ của tôi không được chuyển đổi chính xác. Vấn đề bảo mật, trong khi đáng biết, không liên quan đến câu hỏi cụ thể này.
Eric

1
@Pacerier Cảm ơn, --allow-file-access-from-fileshoạt động tốt.
Ibn Saeed

làm thế nào để thiết lập điều này trong macOS?
Pardeep Jain

14

Tại thời điểm viết bài, có một lỗi trong chrome yêu cầu một xmlnsthuộc tính để kích hoạt hiển thị:

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

Đây là sự cố tôi gặp phải khi cung cấp tệp xml từ máy chủ .


Nếu không giống như tôi, bạn đang xem tệp xml từ một file:///url , thì các giải pháp được đề cập --allow-file-access-from-fileslà những giải pháp bạn muốn


2
Tốt tìm thấy! Đã điền một lỗi cho điều này.
Mohamed Mansour

1
@Peter: nó phụ thuộc vào tài liệu đầu vào của bạn. Thông số XSLT khá rõ ràng ở đây và IE thì quá dễ dãi. Nếu đầu vào là XHTML hợp lệ, nó có khai báo vùng tên. Để XSLT định vị bất kỳ thứ gì trong tài liệu đầu vào đó, bạn phải xác định vùng tên. Tuy nhiên, không cần thiết phải sử dụng không gian tên mặc định (nhưng dễ nhất).
Abel

10
@Eric: hãy xem câu trả lời của tôi, không có gì xúc phạm, nhưng câu trả lời của bạn là sai.
Pacerier

4
Đây không phải là câu trả lời (cũng không phải là giải pháp, và "..." chắc chắn là một chút mơ hồ), Pacerier's là một trong những chính xác.
RedGlyph

Điều này là không chính xác. không yêu cầu giảm tốc. Nó yêu cầu số phiên bản.
UDID

7

Các vấn đề dựa trên Chrome không phải là về các namespace xml đó là xmlns="http://www.w3.org/1999/xhtml". Nếu không có thuộc tính không gian tên, nó cũng sẽ không hoạt động với IE.

Vì giới hạn bảo mật, bạn phải thêm --allow-file-access-from-filescờ khi khởi động chrome. Tôi nghĩ người dùng linux / * nix có thể làm điều đó dễ dàng thông qua thiết bị đầu cuối nhưng đối với người dùng windows, bạn phải mở các thuộc tính của lối tắt Chrome và thêm nó vào đích đích như bên dưới;

Nhấp chuột phải -> Thuộc tính -> Mục tiêu

nhập mô tả hình ảnh ở đây

Đây là đường dẫn đầy đủ mẫu với các cờ mà tôi sử dụng trên máy tính của mình;

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

Tôi hy vọng hiển thị từng bước này sẽ giúp người dùng windows giải quyết vấn đề, đây là lý do tại sao tôi đã thêm bài đăng này.


6

Tôi đã gặp vấn đề tương tự trên localhost. Chạy khắp nơi trên Internet để tìm câu trả lời và tôi chấp thuận rằng việc thêm vào --allow-file-access-from-fileshoạt động. Tôi làm việc trên Mac, vì vậy đối với tôi, tôi phải đi qua thiết bị đầu cuối sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-filesvà nhập mật khẩu của bạn (nếu bạn có).

Một điều nhỏ khác - không có gì sẽ hoạt động trừ khi bạn thêm vào tệp .xml của mình tham chiếu đến tệp .xsl của bạn như sau <?xml-stylesheet type="text/xsl" href="<path to file>"?>. Một điều nhỏ khác mà tôi không nhận ra ngay lập tức - bạn nên mở tệp .xml của mình trong trình duyệt, không phải .xsl.


4

Nó không hoạt động nếu tệp XML (bắt đầu bằng PI tiêu chuẩn:

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

để tham chiếu biểu định kiểu XSL) được phân phát dưới dạng "application / xml". Trong trường hợp đó, Chrome sẽ vẫn tải xuống biểu định kiểu XSL được tham chiếu, nhưng không có gì sẽ được hiển thị, vì nó sẽ âm thầm thay đổi các loại tài liệu từ "application / xml" thành "Document" (! ??) và "text / xsl" thành " Biểu định kiểu "(! ??), và sau đó sẽ cố gắng hiển thị tài liệu XML như thể nó là tài liệu HTML (5), mà không cần chạy bộ xử lý XSLT trước. Và không có gì sẽ được hiển thị trên màn hình (nội dung của nó sẽ tiếp tục hiển thị trang trước mà từ đó trang XML được tham chiếu đến và sẽ tiếp tục quay biểu tượng, như thể tài liệu chưa bao giờ được tải hoàn toàn.

Bạn hoàn toàn có thể sử dụng bảng điều khiển Chrome, điều này cho thấy rằng tất cả các tài nguyên đã được tải nhưng chúng được diễn giải không chính xác.

Vì vậy, có, Chrome hiện chỉ hiển thị các tệp XML (với khai báo biểu định kiểu XSL hàng đầu tùy chọn), chỉ khi nó được phân phát dưới dạng "văn bản / xml", chứ không phải là "ứng dụng / xml" như đối với XML được hiển thị phía máy khách với Khai báo XSL.

Đối với các tệp XML được phân phát dưới dạng "text / xml" hoặc "application / xml" và không chứa khai báo biểu định kiểu XSL, Chrome vẫn nên sử dụng biểu định kiểu mặc định để hiển thị nó dưới dạng cây DOM hoặc ít nhất là nguồn văn bản của nó. Nhưng nó không làm được, và ở đây nó cố gắng kết xuất nó như thể nó là HTML và lỗi ngay lập tức trên nhiều tập lệnh (bao gồm cả tập lệnh nội bộ mặc định) cố gắng truy cập vào "document.body" để xử lý các sự kiện onLoad và chèn một số javascript xử lý trong đó.

Ví dụ về trang web không hoạt động như mong đợi (tài liệu Lisp chung) trong Chrome, nhưng hoạt động trong IE hỗ trợ XSLT phía máy khách:

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

Trang chỉ mục này ở trên được hiển thị chính xác, nhưng tất cả các liên kết sẽ dẫn đến tài liệu XML có khai báo XSL cơ bản đến tài liệu biểu định kiểu XSL hiện có và bạn có thể đợi vô thời hạn, vì nghĩ rằng các chương có vấn đề khi tải xuống. Tất cả những gì bạn có thể làm để đọc tài liệu là mở bảng điều khiển và đọc mã nguồn trong tab Tài nguyên.


3

Gần như tôi có thể nói, Chrome đang tìm kiếm tiêu đề

Loại nội dung: text / xml

Sau đó, nó hoạt động --- các lần lặp lại khác đã không thành công.

Đảm bảo rằng máy chủ web của bạn đang cung cấp điều này. Nó cũng giải thích lý do tại sao nó không thành công đối với tệp: // URI xml tệp.


2

Kiểm tra http://www.aranedabienesraices.com.ar

Trang web này được xây dựng với phía máy khách XML / XSLT. Nó hoạt động trên IE6-7-8, FF, O, Safari và Chrome. Bạn có đang gửi tiêu đề HTTP chính xác không? Bạn có tôn trọng chính sách cùng nguồn gốc không?


Xem câu trả lời của tôi , tôi đã giải quyết nó. Chrome dường như yêu cầu một xmlnsthuộc tính.
Eric

4
Tôi không nghĩ vậy. Để thực hiện chuyển đổi, Chrome không cần đặt không gian tên mặc định thành không gian tên XHTML. Tất nhiên, để hiển thị XHTML nó cần có XHTML phù hợp. Bạn đang trộn mọi thứ.

Trang web được tham chiếu ở trên không được xây dựng bằng XML mà bằng XHTML. Cả hai không hoàn toàn giống nhau (cả hai đều là XML nhưng một cũng là HTML và một thì không).
jerseyboy

1

Tôi đã thử đưa tệp vào wwwroot . Vì vậy, khi truy cập trang trong Chrome, đây là địa chỉ localhost / yourpage.xml .


1

Những gì Eric nói là chính xác.

Trong xsl, đối với thẻ xsl: stylesheet có các thuộc tính sau

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

Nó hoạt động tốt trong chrome.


1

Tôi đã bắt đầu thử nghiệm điều này và gặp phải sự cố bảo mật tệp cục bộ / Chrome. Một cách giải quyết rất đơn giản là đặt tệp XML và XSL vào thư mục chung Dropbox và nhận liên kết đến cả hai tệp. Đặt liên kết đến biến đổi XSL trong phần đầu XML. Sử dụng liên kết XML trong Chrome VÀ NÓ HOẠT ĐỘNG!


1

Sau 8 năm, tình hình có chút thay đổi.

Tôi không thể mở phiên mới của Google Chrome mà không có các thông số khác và cho phép lược đồ 'tệp:'.

Trên macOS, tôi thực hiện:

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

Nếu không có đối số này, tôi không thể kiểm tra biểu định kiểu XSL cục bộ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.