3

サーブレットからhtmlページにxml応答を送信しています。xmlhttprequestオブジェクトのxmlresponseオブジェクトを介して受け取ります。私のxmlドキュメントには、要素としてxsl:stylesheetが含まれています。この要素を抽出し、Javaスクリプトでそのxsltコードを実行します。
出来ますか?これは私のxmlコードです:

<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>


ajax応答からこの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変換のoutput(xmltext1)は-

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

Testing : 1212
</transformiix:result>

しかし、xsltコードに表示されている場合、outputmethodは「text」に設定されています。では、なぜxmlタグが出力に含まれるのですか?

回答
これにより、edit2の説明が得られます。答えてくれてありがとう:)

4

3 に答える 3

1

これは、xmlHttpRequestから名前付きxmlを取得するために使用するものです(この場合、ns = xsl、テストされていません)。

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

サーバーが整形式のxmlを返す場合にのみ、responseXMLを使用できることに注意してください。そうでない場合は、xhr.responseTextを解析する必要があります。

于 2012-05-24T14:27:14.387 に答える
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);
于 2012-05-24T14:09:31.050 に答える
0

私はこのATMを使用しています、うまくいきます!jQueryで書かれたパーサー

http://www.jongma.org/webtools/jquery/xslt/

于 2012-05-24T08:25:29.600 に答える