web-dev-qa-db-fra.com

Comment inclure Javascript dans XML-Document?

La tâche semble être assez simple: comment inclure un fichier Javascript dans un document xml afin qu’Opera et Firefox au moins puissent l’analyser et exécuter le code?

17
snitko

Ajoutez un script indiquant l’espace de noms XHTML, il fonctionnera parfaitement.

<xhtml:script xmlns:xhtml="http://www.w3.org/1999/xhtml"
                src="file.js"
                type="application/javascript"/>

Voir aussi http://www.ibm.com/developerworks/xml/library/x-ffox3/

20
Tim Babych

Si je vous comprends bien, vous souhaitez qu'un document XML exécute le javascript lorsqu'il est affiché dans un navigateur?

Cela ne fait pas partie du standard XML et ne sera donc pas supposé pris en charge jusqu'à ce qu'il le soit (je suppose que cela ne sera jamais pris en charge car XML n'est pas destiné à l'affichage, mais aux données). Si vous parlez de XHTML, il en va tout autrement.

Edit: juste pour clarifier ma réponse. 

XML n’a jamais été conçu pour être un balisage d’affichage comme HTML, c’est pourquoi le XHTML a été développé (HTML conforme aux normes XML). Les navigateurs ont été conçus pour interpréter XHTML d’une certaine manière, mais XML est simplement une donnée brute. 

Si vous souhaitez que votre XML exécute des ajouts tels que JavaScript, envisagez d'utiliser XSLT pour transformer votre XML en XHTML et, par conséquent, tirer parti des fonctionnalités des navigateurs.

10
Ady
<script xmlns="http://www.w3.org/1999/xhtml"><![CDATA[
alert('Hello');
]]></script>

Ou pour le javascript externe:

<script xmlns="http://www.w3.org/1999/xhtml" src="external.js"></script>

Fonctionne dans Firefox et Opera.

7
IllidanS4

J'ai fait ça:

XSLT:  

<xsl:value-of select="/label[@id='MyScript']/text()" disable-output-escaping="yes"/>

XML:

<label id="MyScript"><![CDATA[
<script type="text/javascript">
alert("Hello world");
</script>
]]></label>
2
Rick

Intégrez le code XML et le code Javascript dans un document XHTML, puis utilisez les fonctionnalités vastes et bien documentées du code HTML dynamique. 

Vous obtiendrez quelque chose qui fonctionnera beaucoup plus rapidement que vous ne le ferez en pensant que, certains navigateurs implémentant un style CSS peu documenté et mal documenté, ils doivent donc prendre en charge l'exécution de Javascript intégré dans XML, comme s'il y avait une connexion quelconque. entre ces deux idées.

0
Robert Rossney

Semblable à ce qui précède, mais cela pourrait entraîner une erreur car les portions <![CDATA[ et ]]> ne sont pas des codes valides. Si vous l'insérez dans un script XSL, vous pouvez également placer une marque de commentaire JS avant ces éléments de début et de fin.

J'ai également utilisé l'élément xsl:text pour générer la partie <![CDATA[. Cette partie peut être un peu de triche, mais il résulte en XML bien formé. Un exemple dans un bloc xsl:choose pourrait être ...

...
<xsl:when test='name()="script"'>
  <script>
    <xsl:for-each select='@*'><xsl:copy-of select='.' /></xsl:for-each>
    <xsl:text disable-output-escaping='yes'>
// &lt;![CDATA[
  </xsl:text>
  <xsl:copy-of select='./text()' />
  <xsl:text disable-output-escaping='yes'>
//]]&gt;
  </xsl:text>
  </script>
</xsl:when>
...

En parcourant les morceaux ...

  1. Détecter un élément <script>.
  2. Répliquez la balise <script> pour la sortie.
  3. Veillez à conserver les attributs de balise dans la sortie avec une ligne rapide xsl:for-each.
  4. Produisez le texte non échappé: // <![CDATA[. Le // restitue le reste de la ligne sous forme de commentaire et évite ainsi une erreur JS.
  5. Copiez le contenu du texte de la balise <script>. Remarque: vous devez préconiser la nouvelle ligne (soit comme ci-dessus ou d'une autre manière) afin que la ligne commentée avant de se retrouver sur la même ligne que celle-ci. Évidemment, si c'est le cas, il commentera également cette ligne. Conserver l'un après l'autre n'est pas essentiel, mais conserve l'esthétique des deux balises CDATA correspondantes.
  6. Produisez le texte non échappé: // ]]>. Ceci met fin au bloc CDATA et, encore une fois, le marquage CDATA est ignoré par le navigateur lors de la lecture du JS.
  7. Fermez le bloc avec une balise </script>, bien sûr.
  8. Et, si vous l'utilisez dans un bloc xsl:choose, fermez-le ensuite xsl:when.

Seules les étapes 2, 3, 5 et 7 copient réellement le bloc de script. Le reste, c'est du travail pour le faire fonctionner.

Transformer un bloc tel que ...

...
<script type='javascript'>alert('Hello World!');</script>
...

Devient alors,

...
<script type='javascript'>
// <![CDATA[
alert('Hello World!');
// ]]>
</script>

Conservé efficacement et lisible à la fois par XML et par un navigateur.

0
User51