2016-05-29 9 views
0

Ich möchte mit xslt einige Knoten-Sets mit einem bestimmten Wert in einem Element aus einer XML-Datei auswählen. Ich bekomme den Knoten, den ich möchte, aber ich bekomme auch den serialisierten Text von textnodes. Können Sie mir bitte helfen, diesen Text loszuwerden?Warum Textknoten in transformierten XML erscheinen

Dies ist die Quelldatei:

<surveys> 
<survey id='01'> 
    <category>cat1</category> 
    <questions> 
     <question id='1'>Y</question> 
     <question id='2'>Y</question> 
     <question id='3'>Y</question> 
     <question id='4'>Y</question> 
    </questions> 
</survey> 
<survey id='02'> 
    <category>cat2</category> 
    <questions> 
     <question id='1'>Y</question> 
     <question id='2'>Y</question> 
     <question id='3'>N</question> 
     <question id='4'>N</question> 
    </questions> 
</survey> 
<survey id='03'> 
    <category>cat1</category> 
    <questions> 
     <question id='1'>N</question> 
     <question id='2'>N</question> 
     <question id='3'>N</question> 
     <question id='4'>N</question> 
    </questions> 
</survey> 
<survey id='04'> 
    <category>cat3</category> 
    <questions> 
     <question id='1'>N</question> 
     <question id='2'>N</question> 
     <question id='3'>Y</question> 
     <question id='4'>Y</question> 
    </questions> 
</survey> 
</surveys> 

Dies ist die Datei umwandeln:

<?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" omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <surveys> 
     <category/> 
     <xsl:apply-templates/> 
    </surveys> 
</xsl:template> 

<xsl:template match="survey[category = 'cat2']"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

Und das ist das Ergebnis:

<surveys>cat1YYYY<survey id="02"> 
    <category>cat2</category> 
    <questions> 
     <question id="1">Y</question> 
     <question id="2">Y</question> 
     <question id="3">N</question> 
     <question id="4">N</question> 
    </questions> 
</survey>cat1NNNNcat3NNYY</surveys> 

So würde ich bekommen Löschen von "cat1YYYY" in der ersten Zeile nach dem Erhebungselement und von "cat1NNNNcat3NNYY" in der letzten Zeile nach dem Erhebungselement. Und ich würde gerne verstehen, warum es da ist ;-)

Antwort

2

Ich mag würde zu verstehen, warum es da ist

Es ist da, weil Sie Vorlagen wahllos anwenden - und XSLT hat einige built-in template rules die Textknoten als Standard kopieren.

Um dies zu verhindern, können Sie Ihre eigene Vorlage hinzufügen könnte das Standardverhalten außer Kraft zu setzen:

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

oder - vorzugsweise - anwenden Vorlagen selektiv beginnen:

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

<xsl:template match="/surveys"> 
    <surveys> 
     <category/> 
     <xsl:apply-templates select="survey[category = 'cat2']"/> 
    </surveys> 
</xsl:template> 

<xsl:template match="survey"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

die BTW konnte verkürzt werden zu:

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

<xsl:template match="/surveys"> 
    <surveys> 
     <category/> 
     <xsl:copy-of select="survey[category = 'cat2']"/> 
    </surveys> 
</xsl:template> 

</xsl:stylesheet> 
0

Sie die überflüssigen text() Knoten senden könnte durch Vergessenheit

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

zu Ihrem Stylesheet hinzufügen.

Verwandte Themen