2011-12-28 1 views
0

У меня очень странное поведение, когда я получил мутации в узле в xml, когда пытаюсь разобрать его с помощью XSLT.XSLT странное поведение с умлаутом (мутация)

Итак, теперь мы предполагаем, что CustomerName имеет значение «MÖP».

В этом случае результирующий HTML «а» тег будет иметь HREF на «M% C3% B6P»

<a href="{CustomerName}"> 
    <xsl:value-of disable-output-escaping="yes" select="CustomerName"/> 
</a> 

В этом случае результирующий HTML «DIV» тег будет иметь идентификатор " MÖP '

<div style="display:none"> 
    <xsl:attribute name="id"><xsl:value-of select="CustomerName"/></xsl:attribute> 
</div> 

Похоже, что атрибут href в теге имеет какое-то отношение к нему.

Вопрос, почему это так? Что я могу сделать в обоих случаях, я получил тот же результат?

Greetz

ответ

1

процессор XSLT делает вам одолжение, убегая значение URL в атрибуте элемента HTML ссылка href. Это по дизайну, см. http://www.w3.org/TR/xslt-xquery-serialization/#HTML_ESCAPE-URI-ATTRIBUTES. Если вы действительно этого не хотите, и вы используете процессор XSLT 2.0, вы можете использовать <xsl:ouput method="html" escape-uri-attributes="no"/> в своей таблице стилей.

+0

Но вы могли бы также рассказать мне, как я мог бы сделать это иначе, так что значение атрибута id будет экранировано одинаково? Я работаю под .Net, и в этом случае мне пришлось реализовать Saxon.Net Lib, чтобы преобразовать его, потому что .NET не работает с XSLT2.0. Когда я мог выбирать, я не хочу использовать другую 3. Party Lib. – luke

+0

Нет, значения id не должны иметь такой формат. Если вы хотите, чтобы они были одинаковыми, вы должны попытаться превратить их в ссылки на символы (так что MÖP в обоих случаях станет M Ö P). Но я не уверен, как это сделать с XSLT. –

+0

Если вы используете процессор XSLT 2.0, например Saxon 9, то вы можете использовать такие функции, как http://www.saxonica.com/documentation/functions/intro/escape-html-uri.xml соответственно http://www.saxonica.com /documentation/functions/intro/encode-for-uri.xml. Процессоры XSLT 1.0 не поддерживают эти функции, а .NET XslCompiledTransform вы можете использовать функции/объекты расширения, как описано в http://msdn.microsoft.com/en-us/library/6datxzsd.aspx. Если вам нужна помощь в этом, то подумайте, чтобы начать новый вопрос. –