2012-05-24 2 views
3

내 서블릿에서 xml 응답을 HTML 페이지로 보내고 있습니다. xmlhttprequest 객체의 xmlresponse 객체를 통해 수신합니다. 내 XML 문서에 요소로 xsl : stylesheet가 포함되어 있습니다.이 요소를 추출하여 내 Java 스크립트에서 해당 xslt 코드를 실행하려고합니다.
가능합니까? 이 내 XML 코드 :xml을 파싱하고 javascript에서 xslt 요소를 추출하는 방법

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
Version="2.0" IssueInstant="2012-05-22T13:40:52:390" ProtocolBinding="urn:oasis:na 
mes:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="localhos 
t:8080/consumer.jsp"> 
<UserID> 
    xyz 
</UserID> 
<testing> 
    text 
</testing> 
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> 
    http://localhost:8080/saml/SProvider.jsp 
</saml:Issuer> 
<xslt> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output method="text" /> 
<xsl:template match="/"> 
UserID : <xsl:copy-of select="//UserID"/> 
testing : <xsl:copy-of select="//testing"/> 
</xsl:template> 
</xsl:stylesheet> 
</xslt> 
</samlp:AuthnRequest> 


나는 아약스 응답에서이 XML 문자열을 일단, 나는 XML로 그것을 변환하려면 XSLT 부분을 추출하고 그것을 실행하고 텍스트 영역에 출력을 표시하려면 .
EDIT2
이 코드에 어떤 문제가 :

var xmlDoc=xmlhttp.responseXML; 
    //var xmltext=new XMLSerializer().serializeToString(xmlDoc); 
    var xsltProcessor = new XSLTProcessor(); 
var element=xmlDoc.getElementsByTagNameNS("http://www.w3.org/1999/XSL/Transform","stylesheet");// 
//document.forms['my']['signature'].value=xmltext; 
var stylesheet=xsltProcessor.importStylesheet(element[0]); 
var result=xsltProcessor.transformToDocument(xmlDoc); 
var xmltext1=new XMLSerializer().serializeToString(result); 
document.forms['my']['signature2'].value = xmltext1; 


XSLT 변환의 출력 (xmltext1) 인 -

<transformiix:result xmlns:transformiix="http://www.mozilla.org/TransforMiix"> 
UserID : 1212 

Testing : 1212 
</transformiix:result> 

그러나 당신은 XSLT 코드에서 볼 경우, outputmethod는 "text"로 설정됩니다. 그렇다면 xml 태그가 출력에 왜 포함되어 있습니까?

대답
This
EDIT2에 대한 exlpanation을 제공합니다. 답변 주셔서 감사합니다 :)

답변

1

이 난 단지 최신 크롬에서 테스트하지만, 나를 위해 일한 것입니다 :

var getNsResolver = function (element) { 
    var ns = { 
    samlp: 'urn:oasis:names:tc:SAML:2.0:protocol', 
    xsl: 'http://www.w3.org/1999/XSL/Transform' 
    }; 

    return function (prefix) { 
    return ns[prefix] || null; 
    }; 
}; 

var handleResponse = function (xhr) { 
    var 
    doc = xhr.responseXML, 
    xsl = doc.evaluate('/samlp:AuthnRequest/xslt/xsl:stylesheet', doc, getNsResolver(doc.documentElement), XPathResult.ANY_TYPE, null).iterateNext(), 
    processor = new XSLTProcessor(), 
    result; 

    processor.importStylesheet(xsl); 
    result = processor.transformToFragment(doc, document); 

    document.getElementById('foo').value = result.textContent; 
}; 

window.addEventListener('load', function() { 
    var request = new XMLHttpRequest(); 
    request.addEventListener('load', function (evt) { 
    handleResponse(request); 
    }, false); 

    request.open('GET', 'sample.xml', true); // sample.xml contains the xml from the question 
    request.send(); 
}, false); 
+0

코드 조각을 사용해 보았습니다. 나는 내가 어디로 잘못 갔는지 알 수 없다. 편집을 참조하십시오. – Ashwin

+0

@Ashwin 게시 한 코드를 사용해 보셨습니까? 당신이 추가 한 것은 크게 다릅니다. – Yoshi

+0

그 점도 확인하겠습니다. – Ashwin

1

이 내가에서 XML을 네임 스페이스하는데 사용할 것입니다 (귀하의 경우 ns의의 =의 XSL에서 테스트되지 않음) XMLHttpRequest의 :

var xml=xhr.responseXML; 
var elts = (xml.getElementsByTagNameNS)?xml.getElementsByTagNameNS("ns","tag"):xml.getElementsByTagName("ns\:tag"); 

참고 만 서버가 반환하는 경우 responseXML에 사용할 수 있습니다 잘 형성된 xml. 그렇지 않으면 xhr.responseText를 구문 분석해야합니다.

+0

나는 당신의 코드를 시도했다. 작동하지 않습니다. 편집을 참조하십시오. – Ashwin

+0

편집 내용을 읽었으므로 getElementsByTag와 같은 메소드가 없습니다. 어떤 브라우저를 테스트에 사용 했습니까? – Christophe

+0

죄송합니다. getElementsByTagNameNS()를 사용하고 싶습니다. 코드를 편집했습니다. 여전히 같은 문제. getElementsByTagNameNS()에 대해서는 http://www.w3schools.com/dom/met_element_getelementsbytagnamens.asp를 참조하십시오. mozilla를 사용하고 있습니다. – Ashwin

관련 문제