XSLT заменяет URL в тексте на регулярное выражение - PullRequest
0 голосов
/ 23 мая 2011

У меня есть твиттер xml из Твиттера, который я хочу преобразовать с помощью XSLT.Я хочу, чтобы xslt заменял каждый встречающийся URL в сообщении twitter.Я уже создал следующий шаблон xslt, используя эту и эту тему здесь на stackoverflow.Как мне этого добиться?Если я использую шаблон, как показано ниже, я получаю бесконечный цикл, но я не вижу, где.Как только я закомментирую вызов шаблона 'replaceAll', все, похоже, будет работать, но, разумеется, содержимое твиттер-сообщения не будет заменено.Я новичок в XSLT, поэтому приветствуется любая помощь.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text" omit-xml-declaration="yes" indent="yes"  encoding="utf-8" />
    <xsl:param name="html-content-type" />
    <xsl:variable name="urlRegex" select="8"/>
    <xsl:template match="statuses">
        <xsl:for-each select="//status[position() &lt; 2]">
            <xsl:variable name="TwitterMessage" select="text" />
            <xsl:call-template name="replaceAll">
                <xsl:with-param name="text" select="$TwitterMessage"/>
                <xsl:with-param name="replace" select="De"/> <!--This should become an regex to replace urls, maybe something like the rule below?-->
                <xsl:with-param name="by" select="FOOOO"/> <!--Here I want the matching regex value to be replaced with valid html to create an href-->
                <!--<xsl:value-of select="replace(text,'^http://(.*)\.com','#')"/>
                <xsl:value-of select="text"/>-->
            </xsl:call-template>
            <!--<xsl:value-of select="text"/>-->
            <!--<xsl:apply-templates />-->
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="replaceAll">
        <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="replaceAll">
                    <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>
</xsl:stylesheet>

РЕДАКТИРОВАТЬ: Это в примере подачи XML.

<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
  <created_at>Mon May 16 14:17:12 +0000 2011</created_at>
  <id>10000000000000000</id>
  <text>This is an message from Twitter http://bit.ly/xxxxx http://yfrog.com/xxxxx</text>
<status>

Это просто основной HTML-твиттервыводит по URL, как показано ниже;

http://twitter.com/statuses/user_timeline.xml?screen_name=yourtwitterusername

Этот текст;

This is an message from Twitter http://bit.ly/xxxxx http://yfrog.com/xxxxx

Должен быть преобразован в;

This is an message from Twitter <a href="http://bit.ly/xxxxx>http://bit.ly/xxxxx</a> <a href="http://yfrog.com/xxxxx">http://yfrog.com/xxxxx</a>

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Итак, ваш вопрос не о XSLT. То, что вы хотите, это найти лучший вариант для манипулирования текстовой строкой в ​​XPath. Если вы используете автономный движок XSLT, вы, вероятно, можете использовать XPath 2, который почти обладает необходимой вам мощностью, хотя с регулярными выражениями он получится немного сложным. Если вы работаете с этим движком с поддержкой EXSLT, вам нужно посмотреть, какие функции там доступны. Если вы запускаете это из PHP, манипулирование текстом, как правило, очень хорошо передать в код PHP; Вы делаете это с помощью функции PHP, которая делает то, что вы хотите, и вызываете ее из XSLT, используя php:function('f-name', inputs ...) в качестве выражения XPath.

Что касается регулярных выражений, я думаю, вы ищете что-то вроде этого:

отправить (https?://.*?)(?=[.,:;)]*($|\s)) на <a href="$1">$1</a>.

Если он не соответствует всем URL-адресам, это нормально, и вам нужно обрабатывать только входящие данные, а также манипуляцию в Твиттере. Проверка на пунктуацию в конце ([] в регулярном выражении) - действительно единственная хитрая вещь, которую ваши пользователи ожидают от вас.

1 голос
/ 23 мая 2011

Как правило, я бы не реализовал новую функцию замены.Я бы использовал тот, который предоставил EXSLT.Если ваш XSLT-процессор поддерживает exslt, вам просто нужно установить таблицу стилей следующим образом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:regex="http://exslt.org/regular-expressions"
                extension-element-prefixes="regex"
                version="1.0">

В противном случае загрузите и импортируйте таблицу стилей из EXSLT .

Для глобальногоЗамените, вы можете использовать функцию следующим образом:

<xsl:value-of select="regexp:replace(string($TwitterMessage), 'yourppatern', 'g', 'yourreplace')" />

Извините за общий ответ, но я не могу сейчас проверить XSLT.

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