2011-10-17 4 views
2

XSLを使用してChromeでリンクを表示すると面倒な問題が発生します:すべてのリンクが16進数記号「%0A」で連結されています。
リンクが「www.google.com」の場合、「www.google.com%0A」と表示されます。
この問題は、Google Chromeでのみ発生します。Internet ExplorerとFireFoxは正しくリンクしています。
私の質問は:どうすればGoogle Chromeがリンクを邪魔するのを防ぐのですか? ここではXMLファイルのサンプルです:リンク、xsl、なぜ改行を改行するか(別名%0A HEXシンボル)

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="builtMathCSStatisticsXML.xsl"?> 
<channel> 
<item> 
<title>algrbra 
</title> 
<type>class notes 
</type> 
<staff>Noga Alon 
</staff> 
<semester> 
</semester> 
<year>2011 
</year> 
<donor>anonymous 
</donor> 
<link>https://skydrive.live.com/self.aspx?path=%2f%d7%9e%d7%aa%d7%9e%d7%98%d7%99%d7%a7%d7%94%2f%d7%90%d7%9c%d7%92%d7%91%d7%a8%d7%94%20%d7%911.%d7%a9%d7%99%d7%a2%d7%95%d7%a8%d7%99%d7%9d%20%d7%95%d7%aa%d7%a8%d7%92%d7%99%d7%9c%d7%99%d7%9d.%d7%a0%d7%95%d7%92%d7%94%20%d7%90%d7%9c%d7%95%d7%9f%5e.%d7%aa%d7%a9%d7%a1%5e4%5e4%d7%96%20-%20%d7%a8%d7%95%d7%a2%d7%99%20%d7%a7%d7%9c%d7%99%d7%99%d7%9f.pdf&amp;cid=1f8a5680599afff9 
</link> 
</item> 
... 
</channel> 

は、ここでXSLファイルです:

<?xml version="1.0"? 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <head> 
    <script src="sorttable.js"></script> 
    </head> 
    <body dir="rtl"> 
    <h2>Math CS and Statistics</h2> 
    <table class="sortable"> 
    <thead> 
     <tr bgcolor="#9acd32"> 
     <th>course</th> 
     <th>type</th> 
     <th>proffesor</th> 
     <th>semster</th> 
     <th>year</th> 
     <th>donors</th> 
     <th>links</th> 
     </tr> 
     </thead> 
     <tbody> 
     <xsl:for-each select="channel/item"> 
     <xsl:sort select="title" /> 
     <tr onMouseOver="this.bgColor='yellow';" onMouseOut="this.bgColor='white';"> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="type"/></td> 
     <td><xsl:value-of select="staff"/></td> 
     <td><xsl:value-of select="semester"/></td> 
     <td><xsl:value-of select="year"/></td> 
     <td><xsl:value-of select="donor"/></td> 
     <td> 
    <a target="_blank"><xsl:attribute name="href"> 
     <xsl:value-of select="link"/> 
     </xsl:attribute>link</a> 
     </td> 
     </tr> 
     </xsl:for-each> 
     </tbody> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

感謝!

答えて

2

この動作はXSLT 1.0 Specに応じてあり、その説明はかなりトリッキーです:

:XSL:属性は改行でテキストノードが含まれ、その後、XML出力必見文字参照を含みます。例えば、

<xsl:attribute name="a">x 
y</xsl:attribute> 

出力

a="x&#xA;y" 

(又は任意の同等の文字に関して)をもたらすであろう。 XML出力は、XML 1.0は、スペースに正規化する属性 値の改行文字が必要ですが、文字が正規化されていない文字を改行する を参照する必要があるため、これは

a="x 
y" 

することはできません。 の属性値は、正規化後の属性値を表します。ツリーの属性値にある 改行が、文字参照ではなく 改行文字として出力された場合、XMLを再解析して作成されたツリーの属性値には、改行ではないスペースが含まれています。その木は 正しく出力されていなかったことを示します。

だから、

、あなたが本当に、文字エンティティをしたいを書いていない場合:

<link>string</link> 

なく

また
<link>string 
</link> 

を使用します。

<xsl:attribute name="href"> 
<xsl:value-of select="normalize-space(link)"/> 
</xsl:attribute> 

ただし、空白以外の空白文字または空白文字以外のグループは、1つのスペースで置き換えられることに注意してください。

+0

ありがとう!あなたの答えはとても役に立ちました –

+0

@hershalle:あなたは大歓迎です。 –

1

明らかにFirefoxとIEは違った処理をしますが、XMLの改行文字/改行文字が原因です。私は</link>が残りのリンクの下の行にあると仮定しています。

これを防ぐには、normalize-spaceを使用する必要があります。ここに私が尋ねたのと同様の質問があります。 XSLT find and replace carriage returns

+0

ありがとうございます!あなたは正しい:クロムは違った扱いをする。 –