Как остановить неэкранированные URL-адреса XSL - PullRequest
0 голосов
/ 18 июня 2009

Я использую XSL для отображения XML-представления сообщения электронной почты в браузерах. Вложения электронной почты хранятся в отдельных файлах основного XML-файла электронной почты, поэтому я хочу, чтобы на полученной веб-странице электронной почты содержалась ссылка на ее вложения.

Однако некоторые вложения являются сообщениями электронной почты сами по себе и могут быть переадресованы или отвечать и поэтому могут содержать имена, содержащие двоеточия, такие как FW: Важно . Имя экранируется от URL-адреса как FW% 3AImportant и сохраняется в виде файла как FW% 3AImportant.xml .

Проблема в том, что URL-адрес моей веб-страницы, созданной в XSL, не экранирован и снова содержит двоеточие ( file: // FW: Important.xml ) и, следовательно, является неработающей ссылкой. Каков наилучший способ остановить это поведение?

Вот фрагмент XML:

<email:part email:filename="FW%3AImportant">
    <email:attachment filename="FW%3AImportant.xml">
        FW%3AImportant.xml
    </email:attachment>
</email:part>

А вот фрагмент кода XSL:

<xsl:template match="email:email/email:parts">
    <xsl:for-each select="email:part/email:attachment">
        <a>
            <xsl:attribute name="href">
                <xsl:value-of select="@filename" />
            </xsl:attribute>
            <xsl:value-of select="@filename" />
        </a>
    </xsl:for-each>             
</xsl:template>

1 Ответ

0 голосов
/ 18 июня 2009

Я думаю, вы здесь не на том пути. Не XSLT экранирует ваш URL, это браузер.

Единственные escape-последовательности, известные XML (и, следовательно, XSLT), имеют вид "&xxx;". «%xx» ваших строк URL остается без изменений.

Проблема в том, что ваш <a href="..."> содержит именно ту строку, с которой его пытается браузер. Таким образом, вы делаете что-то не так при кодировании URL.

Когда файл в файловой системе хранится как:

FW%3AImportant.xml

тогда правильный URL для ссылки должен быть:

<a href="FW%253AImportant.xml">FW%3AImportant.xml</a>
<!-- ------^^^ the '%' char itself must be escaped! -->

Это означает, что вы должны закодировать строку в URL, прежде чем поместить ее в атрибут href, как и в любой другой системе, генерирующей HTML.

К сожалению, в XSLT нет встроенной функции кодирования URL. Это означает, что вы можете использовать функцию расширения вашей среды XSLT или выполнить кодирование в отдельном шаблоне с использованием строковых функций XPath. Так как правильная кодировка URL не совсем тривиальна, я рекомендую использовать что-то проверенное здесь. Вот таблица стилей, на которую вы можете ссылаться (<xsl:import>), которая делает это за вас: http://skew.org/xml/stylesheets/url-encode/

...