XSLT가 크롬에서 작동하도록하려면 어떻게해야합니까?


88

여기에 해당 하는 XML 문서가 있습니다. XSL 파일 . 변환은 JavaScript없이 클라이언트 측에서 실행됩니다.

이것은 IE (shock horror)에서는 잘 작동하지만 Google 크롬에서는 문서의 텍스트 노드 만 표시합니다.

예제를 본 것처럼 Chrome에서 클라이언트 측 XSL을 수행 할 수 있다는 것을 알고 있지만 아직이 성공을 직접 복제 할 수는 없습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?


알고있을 때 솔루션을 게시하는 것이 좋습니다. 나는 진지한 일에 Chrome을 실제로 사용하지 않았습니다 .Google 장난감처럼 보입니다. XSLT 클라이언트 측을 수행해야하는 이유는 무엇입니까?
Dimitre Novatchev

난 안해. 그냥 깔끔 할 줄 알았는데. 그리고 나는 여전히 왜 어떤 것들이 Chrome에서 작동하는지 알고 싶지만 내 것은 그렇지 않습니다. 아, 그리고 IE 사용자에게는 페이지의 끔찍한 무지개 스타일링에 대해 죄송합니다.
에릭

12
나를 위해 Chrome은 http : //를 통해 XML을 열 때만 변환을 수행 할 수 있으며 file : //을 통해 작업 할 때는 작동하지 않으며 xmlns-attribute는 나에게 아무런 차이가 없습니다.
Jaroslav Záruba 2010

이 버그는 언급 여기
플라 비오 Cysne을

답변:


116

Eric의 다른 대답은 잘못되었습니다. 그가 언급 한 네임 스페이스 선언은 문제와 관련이 없습니다.

작동하지 않는 진짜 이유는 보안 문제 때문입니다 (참조 : issue 4197 , issue 111905 ).

이 시나리오를 상상해보십시오.

  1. 다운로드 한 웹 페이지를 첨부 파일로 포함하는 공격자로부터 이메일 메시지를 수신합니다.

  2. 브라우저에서 현재 로컬 웹 페이지를 엽니 다.

  3. 로컬 웹 페이지 <iframe>는 소스가 https://mail.google.com/mail/ 인을 만듭니다 .

  4. Gmail에 로그인했기 때문에 프레임은받은 편지함에 메시지를로드합니다.

  5. 로컬 웹 페이지는 JavaScript를 사용하여 프레임의 내용을 읽습니다 frames[0].document.documentElement.innerHTML. (온라인 웹 페이지는 Gmail이 아닌 출처에서 왔기 때문에이 단계를 수행 할 수 없습니다. 동일 출처 정책으로 인해 읽기가 실패합니다.)

  6. 로컬 웹 페이지는받은 편지함의 내용을 a에 넣고 <textarea>POST 양식을 통해 공격자의 웹 서버에 데이터를 제출합니다. 이제 공격자가받은 편지함 을 갖게되어 스팸 을 보내 거나 도난을 식별하는 데 유용 할 수 있습니다.

Chrome은 Chrome을 사용하여 열리는 로컬 파일에 제한을 두어 위의 시나리오를 방해합니다 . 이러한 제한을 극복하기 위해 두 가지 솔루션이 있습니다.

  1. --allow-file-access-from-files 플래그로 Chrome을 실행 해보세요 . 직접 테스트하지는 않았지만 작동한다면 시스템은 위에서 언급 한 종류의 시나리오에 취약해질 것입니다.

  2. 호스트에 업로드하면 문제가 해결됩니다.


2
이것은 사실이지만 그것이 문제의 유일한 원인은 아닙니다. 나는 한동안 "버그"보고서 를 따라왔다 . 그러나 xmlns속성 없이는 서버 측에서도 작동하지 못했습니다 . 최신 버전의 크롬에서 변경되었을 수 있습니다.
Eric

4
@Eric ok 이것은 귀하의 문제에 대한 답변이 아닐 수 있지만 귀하의 질문에 대한 정답입니다. 이 페이지를 방문한 방문자의 의견을 보면 답변으로 표시된 답변이 문제를 해결하지 못하는 것을 알 수 있습니다. (그렇지 않으면 왜 그들이 해결책을 찾기 위해 다른 6 개 답변을 통해 웨이드해야 할 것입니다)
Pacerier

4
@Pacerier : 제 질문에 대한 정답이 아닙니다. 내 질문은 내 서버에서 호스팅되는 한 쌍의 문서가 올바르게 변환되지 않는 이유에 대한 질문이었습니다. 보안 문제는 알 가치가 있지만이 특정 질문과 관련이 없습니다.
Eric

1
@Pacerier 감사합니다, --allow-file-access-from-files잘 작동합니다.
Ibn Saeed

macOS에서 어떻게 설정합니까?
Pardeep Jain

14

글을 쓰는 시점에 렌더링을 트리거하기 위해 속성 이 필요한 크롬 버그 가있었습니다 xmlns.

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

이것은 내가 서버에서 xml 파일 제공 할 때 겪었던 문제였습니다 .


나와 달리 url 에서file:/// xml 파일 보고있는 경우 언급 한 솔루션 --allow-file-access-from-files이 원하는 솔루션 입니다.


2
좋은 찾기! 이것에 대한 버그를 채웠습니다.
Mohamed Mansour

1
@Peter : 입력 문서에 따라 다릅니다. XSLT 사양은 여기에서 매우 명확하며 IE는 너무 관대합니다. 입력이 유효한 XHTML이면 네임 스페이스 선언이 있습니다. XSLT가 해당 입력 문서에서 무엇이든 찾도록하려면 네임 스페이스를 정의해야합니다. 그러나 기본 네임 스페이스를 사용할 필요는 없습니다 (그러나 가장 쉽습니다).
Abel

10
@Eric : 내 대답을보세요. 불쾌하지 않습니다.하지만 대답이 틀 렸습니다.
Pacerier

4
이것은 답이 아닙니다 (솔루션도 아니고 "..."은 확실히 약간 모호합니다). Pacerier의 것이 정답입니다.
RedGlyph 2011 년

이것은 올바르지 않습니다. 감속이 필요하지 않습니다. 버전 번호를 요구합니다.
UDID

7

에 따라 문제 크롬 정보] 아닌 XML 네임 스페이스 입니다 xmlns="http://www.w3.org/1999/xhtml". namesspace 속성이 없으면 IE에서도 작동하지 않습니다.

보안 제한 때문에 --allow-file-access-from-files크롬을 시작할 때 플래그 를 추가해야합니다 . 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>"?>. 내가 즉시 깨닫지 못했던 또 다른 작은 점은 .xsl이 아닌 브라우저에서 .xml 파일을 열어야한다는 것입니다.


4

XML 파일 (표준 PI로 시작하는 경우 :

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

XSL 스타일 시트 참조)는 "application / xml"로 제공됩니다. 이 경우 Chrome은 참조 된 XSL 스타일 시트를 계속 다운로드하지만 문서 유형을 "application / xml"에서 "Document"(! ??)로, "text / xsl"을 "로 자동 변경하므로 아무 것도 렌더링되지 않습니다. Stylesheet "(! ??)를 입력 한 다음 먼저 XSLT 프로세서를 실행하지 않고 마치 HTML (5) 문서 인 것처럼 XML 문서를 렌더링하려고합니다. 그리고 화면에 아무것도 표시되지 않습니다 (이 콘텐츠는 XML 페이지가 참조 된 이전 페이지를 계속 표시하고 문서가 완전히로드되지 않은 것처럼 아이콘을 계속 회전합니다.

모든 리소스가로드되었지만 잘못 해석되었음을 보여주는 Chrome 콘솔을 완벽하게 사용할 수 있습니다.

그렇습니다. Chrome은 현재 XML 파일 (선택적 선행 XSL 스타일 시트 선언 포함) 만 렌더링합니다. 이는 "text / xml"로 제공되는 경우에만 해당되지만 클라이언트 측 렌더링 된 XML에는 "application / xml"로 제공되지 않습니다. XSL 선언.

'text / xml'또는 'application / xml'로 제공되고 XSL 스타일 시트 선언이 포함되지 않은 XML 파일의 경우 Chrome은 여전히 ​​기본 스타일 시트를 사용하여 DOM 트리 또는 최소한 텍스트 소스로 렌더링해야합니다. 그러나 그렇지 않습니다. 여기서 다시 HTML 인 것처럼 렌더링하려고 시도하고, onLoad 이벤트를 처리하고 일부 자바 스크립트를 삽입하기 위해 "document.body"에 액세스하려고 시도하는 많은 스크립트 (기본 내부 스크립트 포함)에서 즉시 버그가 발생합니다. 처리기.

Chrome에서 예상대로 작동하지 않지만 (Common Lisp 문서) 클라이언트 측 XSLT를 지원하는 IE에서는 작동하는 사이트의 예 :

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

위의 색인 페이지는 올바르게 표시되지만 모든 링크는 기존 XSL 스타일 시트 문서에 대한 기본 XSL 선언이있는 XML 문서로 이동하며, 장에 다운로드하는 데 문제가 있다고 생각하여 무기한 기다릴 수 있습니다. 문서를 읽기 위해 할 수있는 일은 콘솔을 열고 리소스 탭에서 소스 코드를 읽는 것입니다.


3

내가 알 수있는 한, Chrome은 헤더를 찾고 있습니다.

콘텐츠 유형 : text / xml

그런 다음 작동합니다 --- 다른 반복이 실패했습니다.

웹 서버가이를 제공하는지 확인하십시오. 또한 file : // URI xml 파일에 대해 실패하는 이유를 설명합니다.


2

http://www.aranedabienesraices.com.ar 확인

이 사이트는 XML / XSLT 클라이언트 측으로 구축되었습니다. IE6-7-8, FF, O, Safari 및 Chrome에서 작동합니다. HTTP 헤더를 올바르게 보내고 있습니까? 동일 출처 정책을 준수하고 있습니까?


내 대답을 참조하십시오 . 나는 그것을 해결했습니다. Chrome에 xmlns속성 이 필요한 것 같습니다 .
에릭

4
나는 그렇게 생각하지 않는다. 변환을 수행하기 위해 Chrome은 기본 네임 스페이스를 XHTML 네임 스페이스로 설정할 필요가 없습니다. 물론 XHTML을 렌더링하려면 적절한 XHTML이 필요합니다. 당신은 물건을 섞고 있습니다.

위에서 언급 한 사이트는 XML이 아니라 XHTML로 구축되었습니다. 둘 다 똑같지는 않습니다 (둘 다 XML이지만 하나는 HTML이고 다른 하나는 그렇지 않습니다).
jerseyboy 2012

1

wwwroot에 파일을 넣어 보았습니다 . 따라서 Chrome에서 페이지에 액세스 할 때 이것은 localhost / yourpage.xml 주소 입니다.


1

Eric의 말이 맞습니다.

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 공용 폴더에 넣고 두 파일에 대한 링크를 가져 오는 것입니다. XML 헤드에 XSL 변환에 대한 링크를 넣으십시오. Chrome에서 XML 링크를 사용하면 작동합니다!


1

8 년이 지나면 상황이 조금 바뀐다.

다른 매개 변수없이 Google 크롬의 새 세션을 열 수 없으며 '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.