XSLT-заменить Апостроф экранированным текстом в выводе
Я пишу шаблон XSLT, который должен вывести допустимый xml-файл для XML-карты сайта.
<url>
<loc>
<xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/>
</loc>
<lastmod>
<xsl:value-of select="concat($node/@updateDate,'+00:00')"/>
</lastmod>
</url>
К сожалению, Url-адрес, который выводится, содержит Апостроф- / what's-new.aspx
Мне нужно избежать ' to '
для карты сайта google. К сожалению, каждая попытка, которую я пробовал, трактует строку ''
' так, как если бы она была"', что недопустимо - расстраивает. XSLT иногда сводит меня с ума.
Есть идеи для техники? (Предположим, я могу найти свой путь вокруг шаблонов XSLT 1.0 и функции)
4 ответа:
Итак, у вас есть
'
на входе, но вам нужна строка
на выходе?В вашем файле XSL замените
'
на&apos;
, используя эту реализацию find / replace (Если вы не используете XSLT 2.0):<xsl:template name="string-replace-all"> <xsl:param name="text"/> <xsl:param name="replace"/> <xsl:param name="by"/> <xsl:choose> <xsl:when test="contains($text,$replace)"> <xsl:value-of select="substring-before($text,$replace)"/> <xsl:value-of select="$by"/> <xsl:call-template name="string-replace-all"> <xsl:with-param name="text" select="substring-after($text,$replace)"/> <xsl:with-param name="replace" select="$replace"/> <xsl:with-param name="by" select="$by"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$text"/> </xsl:otherwise> </xsl:choose> </xsl:template>
Назовем это так:
<loc> <xsl:call-template name="string-replace-all"> <xsl:with-param name="text" select="umbraco.library:NiceUrl($node/@id)"/> <xsl:with-param name="replace" select="'"/> <xsl:with-param name="by" select="&apos;"/> </xsl:call-template> </loc>
Задача
'
интерпретируется XSL как'
.&apos;
будет интерпретироваться как'
.
Самый простой способ удалить ненужные символы из вашего URL-адреса-это изменить правила, которые использует umbraco при создании NiceUrl.
Отредактируйте конфигурацию / umbracoSettings.config
Добавьте правило, чтобы удалить все апострофы из NiceUrls следующим образом:
<urlReplacing> ... <char org="'"></char> <!-- replace ' with nothing --> ... </urlReplacing>
Примечание: содержимое атрибута " org " заменяется содержимым элемента, вот еще один пример:
<char org="+">plus</char> <!-- replace + with the word plus -->
Вы пробовали установить disable-output-escaping в yes для вашего xsl: value-of element:
<xsl:value-of disable-output-escaping="yes" select="umbraco.library:NiceUrl($node/@id)"/>
На самом деле-это, вероятно, противоположно тому, что вы хотите.
Как насчет упаковки xsl: value-of в текстовый элемент xsl:?
<xsl:text><xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/></xsl:text>
Возможно, вам следует попытаться перевести
'
в&apos;