ссылки, xsl и почему Chrome объединяет перевод строки (он же символ% 0A HEX) - PullRequest
2 голосов
/ 17 октября 2011

У меня странная проблема с представлением ссылок в Chrome с использованием XSL: каждая ссылка объединяется с HEX-символом "% 0A".
поэтому, если ссылка «www.google.com», она будет представлена ​​как «www.google.com% 0A».
эта проблема возникает только в Google Chrome - Internet Explorer и FireFox правильно отображают ссылки.
Итак, мой вопрос: как я могу предотвратить Google Chrome не связываться со ссылками? Вот пример файла XML:

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

2 голосов
/ 18 октября 2011

Это поведение соответствует спецификации XSLT 1.0 , и объяснение довольно сложное:

ПРИМЕЧАНИЕ : КогдаАтрибут xsl: содержит текстовый узел с символом новой строки, тогда вывод XML должен содержать ссылку на символ.Например,

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

приведет к выводу

a="x&#xA;y"

(или с любой эквивалентной ссылкой на символ).Выходные данные XML не могут быть

a="x
y"

Это потому, что XML 1.0 требует, чтобы символы новой строки в значениях атрибута были нормализованы в пробелы, но требует, чтобы ссылки на символы новой строки не были нормализованы.Значения атрибута в модели данных представляют значение атрибута после нормализации.Если бы новая строка, встречающаяся в значении атрибута в дереве, выводилась как символ новой строки, а не как ссылка на символ, то значение атрибута в дереве, созданном путем повторного анализа XML, будет содержать пробел, а не символ новой строки, что будет означать, что дерево имеетне выводится правильно.

Итак, если вы действительно не хотите, чтобы символьная сущность, напишите :

<link>string</link>

, а не :

<link>string
</link>

В качестве альтернативы используйте :

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

Однако имейте в виду, что это заменит любую группу непереходящих или непоследних пробелов.символы только с одним пробелом.

1 голос
/ 17 октября 2011

Очевидно, что Firefox и IE обрабатывают это по-разному, но я думаю, что это вызвано символом перевода строки / возврата каретки в вашем XML. Я предполагаю это, поскольку </link> находится на линии ниже остальной части ссылки.

Вы должны быть в состоянии предотвратить это, используя normalize-space . Вот похожий вопрос, который я задал, который более подробно описан в комментариях. XSLT найти и заменить возврат каретки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...