2013-05-15 23 views
9

Aynı XML sayfasını nasıl oluşturabilirim, ancak her bir özelliğin ön ve arka boşlukları kaldırılmış mı? Ben normalize-space() işlevini kullanmayı tercih ediyorum varsayalımXSLT Tüm özelliklerin öndeki ve sonundaki boşlukları kaldır

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

ama ne olursa olsun çalışır:

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

Bu Kime: bundan

Git (XSLT 2.0 kullanarak).

+0

smaccoun şu anda kabul cevap yanlış olduğunu unutmayın. İstenenden daha fazlasını yapar ve yalnızca ön ve arkadaki boşlukları kaldırmaz, aynı zamanda kapalı herhangi bir boşluk alanını yalnızca tek bir alana indirir. @Gunther, bu soruda tam olarak istenen şeyi yapan iyi bir XSLT 2.0 çözümü sağlamıştır. Doğru cevabı kabul etmenizi tavsiye ederim. –

+0

Teşekkürler ... düzeltildi – smaccoun

+0

İyi. Gerçek her zaman sonunda kazanır :) –

cevap

16

normalize-space() yalnızca ön ve arka boşlukları kaldırmakla kalmaz, aynı zamanda ardışık boşluk karakterleri dizilerinin yerine tek bir boşluk karakteri de yükler.

Bir düzenli ifade

sadece baştaki ve sondaki boşluk işlemek için kullanılabilir:

<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, Bekleyin, yine mi? : -D –

+0

@ Joon. Neden "tekrar"? Bu neredeyse bir yıl önceydi. :) –

7

Bu yapmalıyım:

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

Bu aynı zamanda XSLT 1.0 uyumludur. Burada dikkat edilmesi gereken

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

bir şey normalize-space() tek alanlara nitelik değerlerinin içinde herhangi boşluk dönecek olmasıdır, bu nedenle bu: sizin örnek girişi üzerinde çalışan

, sonucudur

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

bu şekilde değiştirilebilir misiniz:

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

w tutmak gerekiyorsa hitespace değeri olduğu gibi, o zaman lütfen Gunther'in cevabına bakın.

+0

-1. Sorun, sadece ön ve arkadaki boşlukları kaldırmak için * sadece * ve kapalı boşlukları tek bir alana normalleştirmek değil. –

+0

@DimitreNovatchev Soruyu okuyabilseydiniz, editörün "Ben normalize-uzay() işlevini kullanmayı tercih ederim, ama her ne işe yaradığını" görürsünüz. – JLRishe

+0

JLRishe, Bu sorunun dile getirilen hedefiyle çelişir - büyük olasılıkla OP, normalize-uzay() 'nın ne olduğunu iyi bilemez. –