2015-03-10 5 views
0
<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), он работает должным образом.

UPDATE

Это мой 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 s в этом файле преобразуются в &#13; и символы новой строки. Итак, я предполагаю, что &#13; не соответствуют xpath. Поэтому мой вопрос должен быть «как мне соответствовать строке« & # 13 »с XPath?».

+0

Newline is ' '. ' ' есть возврат к перевозке. – Barmar

+0

Да, я знаю, я тоже это пробовал. Я собираюсь обновить вопрос, чтобы это отразить. – Federico

ответ

3

Как предложил Barmar, используйте &#10;, соответствующий символ новой строки - и try it online here.

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

XML Input

<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 Output

<?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() функция удаляет начальные и конечные пробелы и заменяет все последовательности пробелов между с одним пробелом , Тогда ваше решение не зависит от появления определенного символа пробела.


EDIT

С обновленным входом, она работает хорошо - я слегка адаптировали матч шаблон (но не содержание):

<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.

+0

Я знаю, что это работает с примером, но почему-то это не работает с моим xml. Я обновил свой вопрос. – Federico

+1

@Federico Также попробуйте вариант 'normalize-space()'. Если это не поможет, укажите _all_ необходимую нам информацию: конечный ввод, как вы достигаете этого HTML, весь код, обрабатывающий XML и XSLT, и так далее. –

+0

Я думаю, что ' ' не работает. Жаль, что ОП не поставил вопрос на примере, который легко воспроизвести. – hakre

1

Вы ищете normalize-space()?

Функция:строканормализуют пространстве

normalize-space функция возвращает аргумент строку с пробельных нормированный отгонкой начальные и конечные пробелы и заменяя последовательности пробельных символов (строка?) одним пространством. Пробельные символы такие же, как и разрешенные продукцией S в формате XML. Если аргумент опущен, по умолчанию используется контекстный узел, преобразованный в строку, другими словами, string-value контекстного узла.

+2

Я не уверен, что вы заметили, но я уже упоминал об этом в своем ответе. –

+0

@ MathiasMüller: Нет, я этого не делал. Давайте сделаем это более заметным на данный момент. – hakre

Смежные вопросы