Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT用正则表达式替换文本中的url_Xml_Xslt - Fatal编程技术网

Xml XSLT用正则表达式替换文本中的url

Xml XSLT用正则表达式替换文本中的url,xml,xslt,Xml,Xslt,我有一个来自Twitter的xml提要,我想用XSLT转换它。我想要xslt做的是替换twittermessage中出现的每个URL。我已经使用stackoverflow上的和主题创建了以下xslt模板。我怎样才能做到这一点?如果我使用下面的模板,我会得到一个无限循环,但我不知道在哪里。一旦我注释掉对“replaceAll”模板的调用,一切似乎都正常,但当然twittermessage的任何内容都不会被替换。我是XSLT新手,因此欢迎提供任何帮助 <?xml version="1.0" e

我有一个来自Twitter的xml提要,我想用XSLT转换它。我想要xslt做的是替换twittermessage中出现的每个URL。我已经使用stackoverflow上的和主题创建了以下xslt模板。我怎样才能做到这一点?如果我使用下面的模板,我会得到一个无限循环,但我不知道在哪里。一旦我注释掉对“replaceAll”模板的调用,一切似乎都正常,但当然twittermessage的任何内容都不会被替换。我是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>
此文本

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>
应转换为

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>
这是一条来自Twitter的消息

通常,我不会实现新的替换功能。我会用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">
<xsl:value-of select="regexp:replace(string($TwitterMessage), 'yourppatern', 'g', 'yourreplace')" />

否则,请从下载并导入样式表

对于全局替换,您可以使用以下功能:

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


很抱歉给出了一般性的答案,但我目前无法测试XSLT。

因此,您的问题不是关于XSLT的。您想要的是找出在XPath中操作文本字符串的最佳选项。如果您使用的是一个独立的XSLT引擎,那么您可能可以使用XPath2,它几乎具有您所需要的功能,不过使用regexs会有点麻烦。如果您是从支持EXSLT的引擎上运行此功能,则需要查找那里有哪些可用功能。如果您是从PHP运行这个程序,文本操作通常非常好,可以交给PHP代码;您可以通过创建一个PHP函数来执行所需操作,并使用
PHP:function('f-name',inputs…)
作为XPath表达式从XSLT调用它

就Regex而言,我猜您正在寻找大致如下的内容:

发送
(https?:/.*?(=[,:;)]*($\s))


如果它不匹配所有的URL,那很好,您只需要处理传入的数据以及Twitter的搜索。检查末尾的标点符号(regex中的
[]
)是用户希望您做的唯一棘手的事情。

您是否考虑过可能使用了错误的技术?XSLT在转换XML的结构方面非常出色,但在修改其内容方面却非常糟糕!对于这类任务,我会使用类似Linq到XML的东西,这样我就可以使用C代码来进行这些更改。@ColinE,说得对!这里的问题只是我正在使用一个标准的CMS组件来提供这些数据。但会考虑项目团队。关于如何使用上述技术解决这个问题,您还有其他想法吗?您能提供一点XML输入吗?@empo补充了一个例子。这还不清楚。请您提供您想要的源文本和结果文本,并解释替换操作的规则,好吗?我建议使用XSLT2.0,它与XPath2.0一起支持正则表达式处理。谢谢您的回答。我明天会回复你的。那个贪婪的正则表达式会把事情搞砸的,更不用说.com了。@Nicholas:可能是的。我只是在重复使用OP正则表达式,没有处理它。最好删除它的引用。因为这个项目有一个截止日期,所以我用javascript完成了这项工作。虽然不是最优雅的解决方案,但它目前仍然有效。最后,我没有使用xslt,而是使用了目前有效的javscript。这不是最优雅的解决方案,但目前是最简单的,因为我为这个项目设定了最后期限。你的答案是最接近的,因为正则表达式确实满足了我的需要。