2009-09-27 31 views
10

Hiện nay tôi sử dụng:Áp dụng XSL để XML bên ngoài

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

Để liên kết XSL để XML.

Nếu xml của tôi đã ở đây: www.externaldomain.com/rss.xml (Ngoài miền của tôi) làm cách nào để tôi có thể nhận được XSL được liên kết với XML?

Tôi có thể trỏ XSL vào một Tệp hoặc Liên kết không?

Trả lời

2

Bạn không thể đạt được điều này với "thuần túy" xml + xslt (*). Một số mã bên ngoài sẽ cần phải xác định xml và xslt sẽ biến đổi nó.

Vì bạn dường như đang chuyển đổi XML, tôi sẽ đoán bạn đang làm điều này trong trình duyệt web.

Bạn có thể thực hiện việc này bằng cách sử dụng javascript, dưới dạng demonstrated on w3schools. Tuy nhiên, hạn chế tên miền chéo vẫn áp dụng nếu bạn đang thực hiện các yêu cầu dựa trên javascript (tức là AJAX/XHR): nếu máy chủ gốc không đặt tiêu đề CORS thích hợp để cho phép truy cập javascript giữa nhiều miền, bạn cần phải ủy quyền yêu cầu xml đó thông qua máy chủ của riêng bạn.

(*): Mad's answer sử dụng tham chiếu thực thể để khéo léo nhúng xml bên ngoài vào tài liệu có chứa. Nó chắc chắn đáng để thử, nhưng lưu ý rằng loại bao gồm dựa trên thực thể này đã được sử dụng trong một số rò rỉ thông tin tiết lộ, đó là lý do tại sao nó không được kích hoạt trong trình phân tích cú pháp xml (đặc biệt, điều này không thể phá hoại CORS trong trình duyệt). Bạn sẽ chỉ phải thử nó trong tình huống của bạn.

+0

Điều này sẽ không hiệu quả, anh ấy đã yêu cầu rõ ràng giải pháp khi xml là "Bên ngoài miền của tôi". Javascript không làm tên miền chéo. Tại sao anh ấy upvoted câu trả lời của bạn là vượt quá tôi vì nó rõ ràng 100% sai và tôi chỉ nhận ra rằng sau khi chi tiêu 20 phút cố gắng để có được ví dụ để làm việc ... Trong thực tế tôi không thể nghĩ ra một thời gian khi ví dụ đó sẽ có bất kỳ sử dụng, nó chỉ hoạt động trên các tập tin trên cùng một tên miền, mà có thể đã được chỉnh sửa ... Vì vậy, về cơ bản những gì tôi đang cố gắng nói là, đó là sai, và tôi downvoted bạn cho nó. – Cody

+0

@Cody: Xin lỗi vì sự thất vọng của bạn, tôi sẽ cập nhật câu trả lời để làm nổi bật yêu cầu cho CORS. Nếu trang web gốc hỗ trợ CORS, bạn có thể làm điều này trong javascript; nếu không bạn cần proxy XML. –

+0

@Cody: Tôi từng là một nhà điều hành cho một công ty và chúng tôi đã làm một số thủ tục. Để biết nếu chúng ta có thể tiếp tục, chúng ta có thể sử dụng một tệp XML đã được một tổ chức đối tác cư trú nhưng chúng tôi không có quyền truy cập vào nó và không có câu hỏi để yêu cầu họ thay đổi bất kỳ thứ gì trong đó. Chúng tôi đã chờ đợi một vài thông tin cụ thể để ở đây và tệp này rất dài. Chúng tôi chỉ muốn hiển thị nội dung của các thẻ cụ thể đó. Vì vậy, chúng tôi đang trong tình huống này, nơi người ta cần áp dụng XSL vào một tệp XML bên ngoài. Trân trọng. –

3

Nếu bạn đang cố gắng chạy XSLT bên trong .NET, bạn có thể dễ dàng sử dụng lớp XslCompiledTransform trong .NET để đạt được điều này.

Nếu bạn đang cố gắng chạy điều này, ví dụ: dòng lệnh, có một loạt các công cụ mà bạn có thể sử dụng để áp dụng một tệp XSLT cho một tệp XML đã cho - thường là một tệp trên ổ cứng cục bộ của bạn.

Xem ví dụ: Trang web của Oleg Tkachenko cho info on NXSLT và các công cụ XSLT khác này hoặc xem CodeProject article này cho tiện ích mở rộng vỏ Windows để áp dụng XSLT cho một tệp XML đã cho (trên đĩa cứng cục bộ của bạn).

Hy vọng điều này sẽ giúp ích một chút.

Marc

13

Bạn có thể tạo tệp XML cục bộ bao gồm nội dung XML của tệp XML từ xa thông qua tham chiếu thực thể.

Ví dụ bên dưới sẽ cung cấp cho bạn nội dung của tệp XML từ xa bên trong một phần tử tài liệu wrapper.

Sau đó, bạn có thể bao gồm hướng dẫn xử lý biểu định kiểu trên tệp XML cục bộ của mình.

Tuy nhiên, vì các tập tin địa phương có wrapper yếu tố tài liệu, bạn có thể cần để trỏ đến một "wrapper XSLT" có sử dụng xsl: import để import XSL.xsl gốc và apply-templates khởi đầu với nội dung bên trong phần tử đóng gói .

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE wrapper [ 
<!ENTITY content SYSTEM "http://stackoverflow.com/feeds"> 
]> 
<?xml-stylesheet type="text/xsl" href="XSL.xsl" ?> 
<wrapper> 
    &content; 
</wrapper> 
2

Bạn có thể viết một tập tin xml địa phương như wrapper:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="XSL.xsl" ?> 
<wrapper Source="http://www.externaldomain.com/rss.xml"/> 

Và mở rộng stylesheet của bạn để nó hiểu được wrapper:

<xsl:template match="wrapper"> 
    <xsl:apply-templates select="document(./@Source)"/> 
</xsl:template> 

tôi đã không kiểm tra nó với XML các tệp trên http nhưng nó hoạt động với các tệp XML cục bộ mà tôi không muốn thay đổi để bao gồm hướng dẫn xử lý xml-stylesheet. Nó hoạt động mit Firefox, Opera và IE (7, tôi chưa thử các phiên bản khác)

Các vấn đề liên quan