2009-08-20 1 views
0

Hallo, zunächst einmal, ich bin nicht sehr vertraut, wenn es um xml und similiar kommt, so bitte nicht mich Frage mit meinem Anfänger bestrafen: DWie vermeidet man Parameter mit allen innerhalb?

Ich habe eine XML-Datei wie folgt aussehen:

<?xml version="1.0" encoding="utf-8" ?> 
<mainstuff> 
    <category_major> 
     <project_name>Dream</project_name> 
     <project_attribute>Version 1.0</project_attribute> 
     <category_A></category_A> 
     <category_B></category_B> 
     <category_C></category_C> 
    </category_major> 
</mainstuff> 

Dann bekam ich eine XSLT-Datei wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="/"> 
    <xsl:element name="mainstuff"> 
     <xsl:attribute name="version">1.0</xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:element>  
    </xsl:template> 

    <xsl:template match="category_major"> 
    <xsl:element name="category_major"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="category_A"> 
    <xsl:element name="category_A"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="category_B"> 
    <xsl:element name="category_B"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="category_C"> 
    <xsl:element name="category_C"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

ich die beiden Parameter „project_name“ und „project_attribute“ vermeiden wollen. Ich möchte ein Ergebnis wie folgt aus:

<?xml version="1.0" encoding="utf-8" ?> 
<mainstuff> 
    <category_major> 
     <category_A></category_A> 
     <category_B></category_B> 
     <category_C></category_C> 
    </category_major> 
</mainstuff> 

Aber was ich bekommen, ist dies nach tranformation:

<?xml version="1.0" encoding="utf-8"?> 
<mainstuff version="1.0"> 
    <category_major> 
     **Dream 
     Version 1.0** 
     <category_A /> 
     <category_B /> 
     <category_C /> 
    </category_major> 
</mainstuff> 

Der Text ist noch drin. Wie kann ich es reparieren. Was mache ich falsch ? Und wie kann ich erkennen, Parameter zu erhalten, aber ohne den darin enthaltenen Text? In meinem Beispiel eine Ausgabe wie folgt aus:

<?xml version="1.0" encoding="utf-8" ?> 
<mainstuff> 
    <category_major> 
     **<project_name></project_name> 
     <project_attribute></project_attribute>** 
     <category_A></category_A> 
     <category_B></category_B> 
     <category_C></category_C> 
    </category_major> 
</mainstuff> 

Danke für Ihre Hilfe: D

+0

Bitte klären - die sich ergeben, Möchtest du? Sie haben nach dem Ergebnis ohne die Parameter und deren Werte gefragt und am Ende haben Sie nach den Parametern ohne ihre Werte gefragt? –

+0

Ich möchte jedes Ergebnis. Eins nach dem anderen: D – Camal

Antwort

2

Wenn es keine Vorlage ist ein Element übereinstimmt, wird eine Standardvorlage verwendet. Die Auswirkung der Standardvorlage ist die Ausgabe des Zeichenfolgenwerts des Knotens. Für ein Element sieht es wie eine Verkettung aller untergeordneten Textknoten aus.

Wenn Sie dieses Verhalten außer Kraft setzen möchten, müssen Sie Ihre eigene no-op-Vorlagen für die Elemente, die Sie überspringen möchten, bieten:

<xsl:template match="project_name | project_attribute" /> 

Für Ihre zweite Anfrage, wenn Sie das Element ausgegeben werden soll, aber abstreifen alle Inhalte, können Sie xsl:copy verwenden:

<xsl:template match="project_name | project_attribute"> 
    <xsl:copy /> 
</xsl:template> 

Beachten Sie, dass xsl:copy nur kopiert das Element; Es kopiert weder seine Attribute noch seine Kinder.

+0

Danke funktioniert super: D – Camal

0

Versuchen Sie es umkehren, entsprechen, was Sie ausschließen möchten, nicht das, was Sie aufnehmen möchten:

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

<xsl:template match="*" priority="0"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="project_name" priority="1"></xsl:template> 
<xsl:template match="project_attribute" priority="1"></xsl:template> 

Sorry, wenn das ein wenig kryptisch ist, aber ich hoffe, es hilft

+0

Die Identitätstransformation (was Sie anscheinend für 'match =" * "') zu verwenden versuchen, ist besser mit 'xsl: copy' geschrieben. Außerdem sind keine expliziten Prioritäten erforderlich - die Priorität einer Vorlage, die mit "*" übereinstimmt, ist immer niedriger als die Priorität einer Vorlage, die einem benannten Element entspricht. –

+0

Prioritäten sind für die Lesbarkeit von was überschrieben wird, ich immer priority = "0" auf Vorlagen, die überschrieben werden sollen, persönlichen Stil und nein, xsl: copy wird keine Vorlagen auf ein Elemente Kinder anwenden, die dafür erforderlich ist Lösung zum Arbeiten – LorenVS

+0

Sie können '' (oder irgendeinen anderen Konstruktor) in '' verwenden. –

Verwandte Themen