如何替换字符串中间的换行符

时间:2015-03-10 16:35:37

标签: php regex xml xslt xpath

 <xsl:value-of 
      select="concat(translate(., 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ áéíóúüÁÉÍÓÚ¿?&gt;&lt;:,&#10;&#13;', 'abcdefghijklmnñopqrstuvwxyz-aeiouuaeiou-------'), '.html')" />

我正在使用此XPath来消除字符串中不需要的字符:

<somenode> This is a string
with new
lines
</somenode>

但它并不像预期的那样取代换行符(&#10;&#13;)。输出仍显示为%0D%0A

在PHP中,当我将此RegEx应用于完全相同的字符串/[\n\r]/(通过$somenode->nodeValue)时,它会按预期工作。

更新

这是我的XML,与示例略有不同:

<temas>
...
<tema>
    <title>La tildación&#13;
diacrítica </title>
    <nav>
        <menu>
            <menu-item>La ortografía acentual: ¿cómo pongo las tildes? </menu-item>
            <menu-item>La tildación&#13;
diacrítica </menu-item>
            <menu-item>El diptongo y el hiato</menu-item>
        </menu>
    </nav>
    <content>
        ...
    </content>
    <pie>
        <prev>La ortografía acentual: ¿cómo pongo las tildes? </prev>
        <next>El diptongo y el hiato</next>
    </pie>
</tema>
</temas>

这是从HTML文件生成的。该文件中的^M转换为&#13;和换行符。所以,我的猜测是&#13;与xpath不匹配。所以我的问题应该是“如何将字符串'&amp;#13'与XPath匹配?”。

2 个答案:

答案 0 :(得分:3)

正如Barmar建议的那样,使用&#10;,正确的换行符 - 和try it online here

如果这对您不起作用,请展示您的XSLT代码的完整,可验证的样本(整个样式表),并说明您正在使用的XSLT版本和处理器。

XML输入

<somenode> This is a string
with new
lines
</somenode>

<强>样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="somenode">
        <xsl:copy>
            <xsl:value-of 
      select="concat(translate(., 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ áéíóúüÁÉÍÓÚ¿?&gt;&lt;:,&#10;', 'abcdefghijklmnñopqrstuvwxyz-aeiouuaeiou-------'), '.html')" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

XML输出

<?xml version="1.0" encoding="utf-8"?>
<somenode>-this-is-a-string-with-new-lines-.html</somenode>

另一种方法是在用translate()替换其中的字符之前规范化所有字符串值:

concat(translate(normalize-space(.), 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ áéíóúüÁÉÍÓÚ¿?&gt;&lt;: ', 'abcdefghijklmnñopqrstuvwxyz-aeiouuaeiou-------'), '.html')"

normalize-space()函数删除前导和尾随空格,并用一个空格字符替换其间的所有空格序列。然后,您的解决方案不依赖于特定空白字符的出现。


修改

使用您更新的输入,它也可以 - 我稍微调整了模板匹配(但不是内容):

<xsl:template match="title">
        <xsl:copy>
            <xsl:value-of 
      select="concat(translate(normalize-space(.), 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ áéíóúüÁÉÍÓÚ¿?&gt;&lt;: ', 'abcdefghijklmnñopqrstuvwxyz-aeiouuaeiou-------'), '.html')" />
        </xsl:copy>
</xsl:template>

试试here

答案 1 :(得分:1)

您在寻找normalize-space()吗?

  

功能: 字符串 规范化空间字符串?

     

normalize-space函数返回带有空格的参数字符串,该空格通过去除前导和尾随空格并用空格替换空白字符序列来规范化。空格字符与XML中S生成所允许的字符相同。如果省略该参数,则默认为转换为字符串的上下文节点,换句话说是上下文节点的string-value