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


How to replace newline character in the middle of string

 <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 中,当我将此正则表达式应用于完全相同的字符串/['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 不匹配。所以我的问题应该是"如何将字符串'&#13'与 XPath 匹配?

正如 Barmar 所建议的那样,使用 &#10; ,正确的换行符 - 并在此处在线尝试。

如果这对您不起作用,请出示完整的、可验证的 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>

在这里试试。

你在寻找normalize-space()吗?

函数:字符串规范化空间字符串?

规范化空格

函数返回参数字符串,其中空格通过去除前导和尾随空格并将空格字符序列替换为单个空格来规范化。空格字符与 XML 中 S 生产允许的字符相同。如果省略参数,则默认转换为转换为字符串的上下文节点,换句话说,上下文节点的字符串值。