53 Stimmen

XSLT - Leerzeichen aus der Vorlage entfernen

Ich verwende XML, um eine kleine Kontaktliste zu speichern, und versuche, eine XSL-Vorlage zu schreiben, die sie in eine CSV-Datei umwandelt. Das Problem, das ich habe, ist mit Leerzeichen in der Ausgabe.

Das Ergebnis:

Friend, John, Smith, Home,
        123 test,
       Sebastopol,
       California,
       12345,
     Home 1-800-123-4567, Personal john.smith@gmail.com

Ich habe sowohl die XML-Quelldatei als auch die zugehörige XSL-Vorlage eingerückt, um sie leichter lesen und entwickeln zu können, aber all der zusätzliche Leerraum wird in die Ausgabe übernommen. Die XML selbst hat keinen zusätzlichen Leerraum innerhalb der Knoten, nur außerhalb von ihnen für die Formatierung, und das gleiche gilt für die XSLT.

Damit die CSV-Datei gültig ist, muss jeder Eintrag in einer eigenen Zeile stehen und darf nicht unterbrochen sein. Neben dem Entfernen aller zusätzlichen Leerzeichen aus dem XML und XSLT (so dass sie nur eine lange Codezeile), gibt es einen anderen Weg, um loszuwerden, die Leerzeichen in der Ausgabe?

Bearbeiten: Hier ist ein kleines XML-Beispiel:

<PHONEBOOK>
    <LISTING>
        <FIRST>John</FIRST>
        <LAST>Smith</LAST>
        <ADDRESS TYPE="Home">
            <STREET>123 test</STREET>
            <CITY>Sebastopol</CITY>
            <STATE>California</STATE>
            <ZIP>12345</ZIP>
        </ADDRESS>
        <PHONE>1-800-123-4567</PHONE>
        <EMAIL>john.smith@gmail.com</EMAIL>
        <RELATION>Friend</RELATION>
    </LISTING>
</PHONEBOOK>

Und hier ist die XSLT:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />

 <xsl:template match="/">
   <xsl:for-each select="//LISTING">
    <xsl:value-of select="RELATION" /><xsl:text>, </xsl:text>
    <xsl:value-of select="FIRST" /><xsl:text>, </xsl:text>
    <xsl:value-of select="LAST" /><xsl:text>, </xsl:text>

    <xsl:if test="ADDRESS">
     <xsl:for-each select="ADDRESS">
       <xsl:choose>
        <xsl:when test="@TYPE">
         <xsl:value-of select="@TYPE" />,
        </xsl:when>
            <xsl:otherwise>
            <xsl:text>Home </xsl:text>
            </xsl:otherwise>
       </xsl:choose>
       <xsl:value-of select="STREET" />,
       <xsl:value-of select="CITY" />,
       <xsl:value-of select="STATE" />,
       <xsl:value-of select="ZIP" />,
     </xsl:for-each>
    </xsl:if>

    <xsl:for-each select="PHONE">
      <xsl:choose>
       <xsl:when test="@TYPE">
        <xsl:value-of select="@TYPE" />  
       </xsl:when>
       <xsl:otherwise><xsl:text>Home </xsl:text></xsl:otherwise>
      </xsl:choose>
     <xsl:value-of select="."  /><xsl:text  >, </xsl:text>
    </xsl:for-each>

    <xsl:if test="EMAIL">
     <xsl:for-each select="EMAIL">
      <xsl:choose>
       <xsl:when test="@TYPE">
        <xsl:value-of select="@TYPE" /><xsl:text  > </xsl:text> 
       </xsl:when>
       <xsl:otherwise><xsl:text  >Personal </xsl:text></xsl:otherwise>
      </xsl:choose>
      <xsl:value-of select="."  /><xsl:text  >, </xsl:text>
     </xsl:for-each>
    </xsl:if>
    <xsl:text>&#10;&#13;</xsl:text>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>

1voto

Cylian Punkte 10460

Diese Antwort ist möglicherweise keine direkte Antwort auf das Problem. Aber ein allgemeiner Weg, dieses Problem zu lösen. Erstellen Sie eine Vorlagenregel:

<xsl:template name="strip-space">
    <xsl:param name="data"/>
    <xsl:value-of select="normalize-space($data)"/>
</xsl:template>

Rufen Sie es nun auf, um überschüssigen Leerraum zu entfernen:

<xsl:template match="my-element">
    <xsl:call-template name="strip-space">
        <xsl:with-param name="data">
            <xsl:apply-templates/>
        </xsl:with-param>
    </xsl:call-template>
</xsl:template>

Betrachten Sie zum Beispiel das folgende XML-Fragment:

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <my-element>
        <e1>some text</e1> <e2>some other text</e2> <e3>some other text</e3>
    </my-element>
</test>

Und wenn jemand es in den unteren Text umwandeln möchte:

{test{my-element{e1some text} {e2some other text} {e3some other text}}}

Jetzt kommt das Stylesheet:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />

    <xsl:template match="/">
        <xsl:apply-templates mode="t1"/>
        <xsl:text>&#xa;</xsl:text>
        <xsl:apply-templates mode="t2"/>
    </xsl:template>

    <xsl:template match="*" mode="t1">
        <xsl:text>{</xsl:text>
        <xsl:value-of select="local-name()"/>
        <xsl:call-template name="strip-space">
            <xsl:with-param name="data">
                <xsl:apply-templates mode="t1"/>
            </xsl:with-param>
        </xsl:call-template>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <xsl:template match="*" mode="t2">
        <xsl:text>{</xsl:text>
        <xsl:value-of select="local-name()"/>
        <xsl:value-of select="."/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <xsl:template name="strip-space">
        <xsl:param name="data"/>
        <xsl:value-of select="normalize-space($data)"/>
    </xsl:template>

</xsl:stylesheet>

Nach der Anwendung des Stylesheets wird es produziert:

{test{my-element{e1some text} {e2some other text} {e3some other text}}}

{test

        some text some other text some other text

}

Die Ausgabe beschreibt, wie @mode="t1" ( <xsl:value-of select="."/> Ansatz) unterscheidet sich von dem @mode="t2" ( xsl:call-template Ansatz). Ich hoffe, das hilft jemandem.

0voto

Nick Groznykh Punkte 19

Fügen Sie eine Vorlage in Ihre xslt ein

<xsl:template match="text()"/>

0voto

Tejas Sawant Punkte 21

Ändern Sie den Code, den wir zum Formatieren der Xml-Rohdatei verwendet haben, indem Sie die folgenden Zeilen entfernen, um zusätzliche Leerzeichen in der exportierten Excel-Datei zu entfernen.

Bei der Formatierung mit dem System der eingerückten Eigenschaften werden zusätzliche Leerzeichen hinzugefügt.

Kommentieren Sie die Zeilen, die sich auf die Formatierung von Xml beziehen, wie die untere Zeile und versuchen Sie es.

xmlWriter.Formatting = System.Xml.Formatting.Indented;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X