2013-05-15 9 views
9

Wie kann ich ein identisches XML-Blatt erstellen, aber die führenden und nachfolgenden Leerzeichen jedes Attributs entfernt? (Unter Verwendung von XSLT 2.0)XSLT Entfernen führender und nachgestellter Leerzeichen aller Attribute

Go aus diesem:

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

Um dies:

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

Ich glaube, ich würde es vorziehen, die normalize-space() Funktion zu nutzen, aber was auch immer funktioniert.

+0

smaccoun, bitte beachten Sie, dass die derzeit akzeptierte Antwort ist falsch:

Ein regulärer Ausdruck kann nur führende und nachfolgende Leerzeichen zu behandeln verwendet werden. Es macht mehr als das, was angefordert wird, und entfernt nicht nur den führenden und nachfolgenden Leerraum, sondern reduziert auch alle eingeschlossenen Leerräume auf nur ein einziges Leerzeichen. @Gunther hat eine gute XSLT 2.0-Lösung zur Verfügung gestellt, die genau das tut, was in dieser Frage erwünscht ist. Ich empfehle, die richtige Antwort zu akzeptieren. –

+0

danke ... korrigiert – smaccoun

+0

Gut. Die Wahrheit gewinnt immer am Ende :) –

Antwort

16

normalize-space() werden nicht nur führende und nachfolgende Leerzeichen entfernt, sondern es wird auch ein einzelnes Leerzeichen anstelle einer Folge aufeinanderfolgender Leerzeichen installiert.

<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 für die Buchung der einzigen richtigen Antwort. –

+1

@DimitreNovatchev, Warte, du schon wieder? :-D –

+0

@JonL., Warum "wieder"? Das war vor fast einem Jahr. :) –

7

Dies sollte es tun:

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

Dies ist XSLT auch 1.0 kompatibel.

Wenn auf Ihrem Abtastwerteingang laufen, ist das Ergebnis:

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

Eine Sache, hier zu beachten ist, dass normalize-space() innerhalb der Attributwerte in einzelne Leerzeichen alle Leerzeichen verwandeln, so folgt aus:

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

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

Wenn Sie w halten müssen:

Würde ich dies geändert werden hitespace innerhalb des Wertes wie es ist, dann sehen Sie bitte Gunthers Antwort.

+0

-1 für eine falsche Antwort. Das Problem besteht darin, * nur * den führenden und nachfolgenden Leerraum zu entfernen - und nicht den eingeschlossenen Leerraum zu einem einzigen Leerzeichen zu normalisieren. –

+0

@DimitreNovatchev Wenn Sie die ganze Frage gelesen hätten, würden Sie sehen, dass der Fragesteller sagte: "Ich nehme an, ich würde es vorziehen, die Funktion' normalize-space() 'zu verwenden, aber was auch immer funktioniert." – JLRishe

+0

JLRishe, Dies widerspricht dem geäußerten Ziel der Frage - höchstwahrscheinlich weiß die OP nicht gut, was 'normalize-space()' tut. –

Verwandte Themen