2013-05-15 3 views
9

Как создать идентичный XML-лист, но с удалением ведущих и завершающих пробелов каждого атрибута? (С использованием XSLT 2.0)XSLT Удалить начальные и конечные пробелы всех атрибутов

Go от этого:

<node id="DSN "> 
    <event id=" 2190 "> 
     <attribute key=" Teardown"/> 
     <attribute key="Resource "/> 
    </event> 
</node> 

Для этого:

<node id="DSN"> 
    <event id="2190"> 
     <attribute key="Teardown"/> 
     <attribute key="Resource"/> 
    </event> 
</node> 

Я полагаю, я бы предпочел, чтобы использовать функцию normalize-space(), но все работает.

+0

smaccoun, пожалуйста, имейте в виду, что принятый в настоящее время ответ неверен. Он выполняет больше, чем запрашивается, и не только удаляет ведущие и конечные пробелы, но также уменьшает любые закрытые пробелы только до одного пробела. @Gunther предоставила хорошее решение XSLT 2.0, которое делает именно то, что требуется в этом вопросе. Я рекомендую принять правильный ответ. –

+0

спасибо ... исправлено – smaccoun

+0

Хорошо. Правда всегда выигрывает в конце :) –

ответ

16

normalize-space() не только удалит ведущие и конечные пробелы, но также установит один пробельный символ вместо последовательности последовательных пробельных символов.

Регулярное выражение может быть использовано для обработки только начальные и конечные пробельные символы:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:template match="node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:attribute name="{local-name()}" namespace="{namespace-uri()}"> 
     <xsl:value-of select="replace(., '^\s+|\s+$', '')"/> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
+1

+1 для публикации единственного правильного ответа. –

+1

@DimitreNovatchev, Подождите, вы снова? :-D –

+0

@JonL., Почему «снова»? Это было почти год назад. :) –

7

Это следует сделать это:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="normalize-space()"/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

Это также XSLT 1.0 совместимы.

При запуске на своем входе пробы, результат:

<node id="DSN"> 
    <event id="2190"> 
    <attribute key="Teardown" /> 
    <attribute key="Resource" /> 
    </event> 
</node> 

Одна вещь, чтобы отметить здесь, что normalize-space() превратит любой пробел в пределах значений атрибутов в единые пространства, так это:

<element attr=" this is an 
        attribute " /> 

бы быть изменен следующим образом:

<element attr="this is an attribute" /> 

Если вам нужно сохранить вес hitespace внутри значения as-is, тогда, пожалуйста, см. ответ Гюнтера.

+0

-1 за неправильный ответ. Проблема заключается только в том, что * удалять ведущее и завершающее пробелы - и не нормализовать замкнутые пробелы до одного пробела. –

+0

@DimitreNovatchev Если вы прочитаете весь вопрос, вы увидите, что спрашивающий сказал: «Полагаю, я предпочел бы использовать функцию' normalize-space() ', но все работает». – JLRishe

+0

JLRishe. Это противоречит выраженной цели вопроса - скорее всего, OP не знает, что делает 'normalize-space()'. –

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