web-dev-qa-db-ja.com

文字をエスケープした後でも、xsltに(&)を出力させることができません

&記号で区切られた変数割り当てのクエリ文字列を作成しようとしています(例:"var1=x&var2=y&...")。この文字列を埋め込みフラッシュファイルに渡す予定です。

XSLTに&記号を表示するのに問題があります。タグを付けずに&と入力すると、XSLTドキュメントのレンダリングに問題が発生します。タグを付けずに&amp;と入力すると、ドキュメントの出力は変更なしで&amp;になります。 <xsl:value-of select="&" />または<xsl:value-of select="&amp;" />と入力すると、エラーも発生します。これは可能ですか?注:&amp;amp;も試しましたが、成功しませんでした。

19
Bill

disable-output-escapingCDATAセクションと組み合わせることができます。これを試して:

<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
17
Kevin Hakanson

_&_記号で区切られた変数割り当てのクエリ文字列を作成しようとしています(例:_"var1=x&var2=y&..."_)。この文字列を埋め込みフラッシュファイルに渡す予定です。

XSLTに_&_シンボルを表示するのに問題があります。

このようなURLを作成する方法の実行可能な短く完全なデモがあります:

_<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vX" select="'x'"/>
 <xsl:variable name="vY" select="'y'"/>
 <xsl:variable name="vZ" select="'z'"/>

  <xsl:template match="/">
    <xsl:value-of select=
"concat('http://www.myUrl.com/?vA=a&amp;vX=', $vX, '&amp;vY=', $vY, '&amp;vZ=', $vZ)"/>
  </xsl:template>
</xsl:stylesheet>
_

この変換がソースXMLドキュメントに適用される場合(無視)

_<t/>
_

必要な正しい結果が生成されます:

_http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z
_

質問で提起された他の問題について:

タグを付けずに_&amp;_と入力すると、ドキュメントの出力は変更なしで_&amp;_になります。

上記のステートメントは単に真実ではありません...上記の変換を実行して結果を確認してください。

実際に何が起こっているのか

表示されている結果は完全に正しいですが、出力方法はhtmlまたはxml(_method=_のデフォルト値)であるため、XSLTプロセッサーのシリアライザーは正しいものを表す必要があります結果-文字列_http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z_-整形式のXMLドキュメントまたはHTMLツリーのテキストノード(の一部)として。

整形式のXMLドキュメントでの定義により、リテラルのアンパサンドは、組み込みの_&amp;_または_&#38;_、または_&#x26;_などの文字参照によってエスケープする必要があります。

Remember:XMLテキストノード(の一部)として、またはHTMLツリー内で表される文字列は、表されると同じ文字列のように見えない場合がありますテキストとして。それにもかかわらず、これらは同じ文字列の2つの異なる表現です。

この単純な事実をよりよく理解するには、次のようにします

上記の変換を行い、_xsl:output_宣言を置き換えます。

_ <xsl:output method="text"/>
_

これで:

_ <xsl:output method="xml"/>
_

また、出力を単一のXML要素で囲みます。アンパサンドに別のエスケープを使用することもできます。変換は次のようになります。

_<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" method="xml"/>

 <xsl:variable name="vX" select="'x'"/>
 <xsl:variable name="vY" select="'y'"/>
 <xsl:variable name="vZ" select="'z'"/>

  <xsl:template match="/">
        <t>
            <xsl:value-of select=
 "concat('http://www.myUrl.com/?vA=a&amp;vX=', $vX, '&#38;vY=', $vY, '&#x26;vZ=', $vZ)"/>
        </t>
  </xsl:template>
</xsl:stylesheet>
_

そして結果は

_<t>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z</t>
_

出力メソッドhtmlでも同じ結果が得られます。

質問

出力されるURLは、最初の変換で出力されたURLとは異なりますか(または「破損」していますか)?

回答

いいえ、どちらの場合も同じ文字列が出力されましたが、いずれの場合も、文字列の異なる表現が使用されました。

質問

必要なURLを出力するには、DOE(_disable-output-escaping="yes"_)属性を使用する必要がありますか?

回答

いいえ、最初の変換で示されているように。

質問

必要なURLを出力するために、DOE(_disable-output-escaping="yes"_)属性を使用することをお勧めしますか?

回答

いいえ、DOEの使用はXSLTの悪い習慣であり、通常、プログラマーがXSLT処理モデルを十分に理解していないことを示しています。また、DOEはXSLT 1.0のオプション機能にすぎず、XSLTプロセッサがDOEを実装していない可能性があります。実装している場合でも、別のXSLTプロセッサで同じ変換を実行すると問題が発生する可能性があります。

質問

私は私が賞金を払った質問とは別の問題から来ました。私の問題:私はこのonclickメソッドを生成しようとします:

_    <input type="submit" 
onClick="return confirm('are you sure?') && confirm('seriously?');" />
_

私が作成できるのは、確認を関数に配置できることです...しかし、属性内に&を作成できないというバグがあります!この質問の解決は、私が思う私の問題の解決です。

回答

実際には、属性内のJavaScript式内で_&&_ブール演算を_&amp;&amp;_として表すことで指定できます。

これは完全な例で、Chrome、Firefox 41.1.01、IE11の3つのブラウザーで行ったように誰でも実行できます。

[〜#〜] html [〜#〜]

_<!DOCTYPE html> 

    <html> 
      <head> 
        <link rel="stylesheet" href="style.css"> 
        <script src="script.js"></script> 
      </head> 
      <body> 
        <h1>Hello Plunker!</h1> 
        <input type="submit" 
onClick="alert(confirm('are you sure?') &amp;&amp; confirm('seriously?'));" /> 
      </body> 
    </html>
_

JavaScript(script.js):

_function confirm(message) { 
  alert(message); 
  return message === 'are you sure?'; 

}
_

これを実行すると、最初にこのアラートが表示されます:

enter image description here

次に、OKボタンをクリックすると、2番目のアラートが表示されます。

enter image description here

そして、OKをクリックすると、最終的に_&&_操作の結果を生成するアラートが表示されます。

enter image description here

confirm()関数に渡される引数の値を変更することでこのコードを試すことができ、生成された結果が_&&_演算子を使用した結果であることを確認します。

たとえば、_<input>_要素を次のように変更した場合:

_<input type="submit" 
onClick="alert(confirm('really sure?') &amp;&amp; confirm('seriously?'));" /> 
_

最初にこのアラートが表示されます。

enter image description here

そして、OKをクリックすると、すぐに_&&_操作の最終結果が得られます。

enter image description here

_&&_操作の第1オペランドがfalseであり、JavaScriptが_&&_をショートカットしているため、2番目のアラートはスキップされます。第1オペランドはfalseです。

要約すると

_&&_オペランドを_&&_として指定することにより、XSLTによって生成されたHTMLドキュメントの属性内で_&amp;&amp;_演算子を簡単に使用できます。

12

URIをHTMLまたはXHTMLで表現していますか?例えば<tag attr="http://foo.bar/?key=value&amp;key2=value2&amp;..."/>もしそうなら、 "&amp; "は、必要なリテラルURIとは異なって見える場合でも、属性値でアンパサンドを表現する正しい方法です。ブラウザーは" &amp; "およびその他の文字エンティティ参照をロードする前、またはFlashに渡す前。リテラルを埋め込むには、" & "HTMLまたはXHTMLで直接正しくありません。

また、このようなことをより明確に考えるために、個人的にはXMLについてもっと学ぶことをお勧めします。たとえば、W3C DOMをもっと使用してみてください(単なるJavascript以上のもの)。日常的に使用しなくても、DOMを学ぶことで、XMLのツリー構造を正しく考え、属性と要素を正しくエンコードする方法を考えることができました。

10
user4010

使用する disable-output-escaping="yes"あなたのvalue-of 鬼ごっこ

6
Thunder3

XMLファイルを出力として生成しようとしている場合は、&amp;を生成する必要があります(&自体は無効なXMLであるため)。文字列を生成するだけの場合は、xsl:stylesheetの子として以下を含めることにより、スタイルシートの出力モードをtextに設定する必要があります。

<xsl:output method="text"/>

これにより、スタイルシートがエスケープするのを防ぎ、<xsl:value-of select="'&amp;'" />&を生成するはずです。

4
ashirley

トランスフォームがXMLドキュメントを出力している場合は、出力エスケープを無効にしないでください。 wantマークアップ文字を出力でエスケープして、不正な形式のXMLを出力しないようにします。出力を処理しているXMLオブジェクト(DOMなど)は、テキストのエスケープを解除します。

XMLオブジェクトの代わりに文字列操作を使用して出力を処理している場合は、問題があります。しかし、問題はXSLTにあるのではなく、文字列操作を使用してXMLを処理するという決定にあります。これは、ほとんどの場合、悪い問題です。

トランスフォームがHTMLまたはテキストを出力している場合(そして、出力タイプを<xsl:output>要素に設定している場合)、それは別の話です。次に、disable-output-escaping='yes'要素で<xsl:value-of>を使用するのが適切です。

ただし、いずれの場合も、CDATAセクションでテキストをラップしていない限り、XSLTのテキストノードでマークアップ文字をエスケープする必要があります。

3
Robert Rossney

&に置き換えるだけ

<![CDATA[&]]>

データで。例:データXML

<title>Empire <![CDATA[&]]> Burlesque</title>

XSLTタグ:

<xsl:value-of select="title" />

出力:エンパイア&バーレスク

1
Ram

出力エスケープを無効にすると、ジョブが実行されます......この属性はテキストでのみサポートされているため、テンプレートを操作することもできます。例:

 <xsl:variable name="replaced">

    <xsl:call-template name='app'>
      <xsl:with-param name='name'/>       
    </xsl:call-template>
  </xsl:variable>


<xsl:value-of select="$replaced" disable-output-escaping="yes"/>

--->テンプレート呼び出しを変数にラップし、disable-output-escaping = "yes"を使用しました。

1
Taran

disable-output-escaping属性(ブール値)を使用するのが、おそらくこれを達成する最も簡単な方法です。これは、<xsl:value-of/>だけでなく、特定のケースによってはよりクリーンな<xsl:text>でも使用できることに注意してください。

仕様の関連部分は次のとおりです。 http://www.w3.org/TR/xslt#disable-output-escaping

0
tomasr

次のように、nodeまたはstring/textの値内でdisable-output-escapingを使用できることに注意してください。

<xsl:value-of select="/node/here" disable-output-escaping="yes" />

または

<xsl:value-of select="'&amp;'" disable-output-escaping="yes" />
<xsl:text disable-output-escaping="yes">Texas A&amp;M</xsl:text>

xsl:value-ofの単一引用符に注意してください。

ただし、属性でdisable-output-escapingを使用することはできません。私はそれが完全に台無しになっていることを知っています、しかし、それは物事がXSLT1.0である方法です。したがって、以下は[〜#〜]動作しません[〜#〜]は機能しません:

<xsl:value-of select="/node/here/@ttribute" disable-output-escaping="yes" />

細字で引用されているので:

したがって、使用される<xsl:value-of />または<xsl:text />要素の出力エスケープを無効にするのはerrorです。コメント、処理命令、または属性ノードの文字列値を生成します。

強調鉱山。

取得元: http://www.w3.org/TR/xslt#disable-output-escaping

0
Nika

org.Apache.xalan.xslt.Process、バージョン2.7.2は、上記の「このようなURLを生成する方法の実行可能な短く完全なデモです」に出力します。

<?xml version="1.0" encoding="UTF-8"?>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z11522

XML宣言は追加のomit-xml-declaration="yes"で抑制されますが、出力method="text"でアンパサンドをエスケープすることは正当化されません。

0
Peter Dolland