2 Stimmen

Abrufen des Namens des untergeordneten Knotens von XML mit XSL

Ich habe ein XML-Programm in der folgenden Struktur

<Part>
     <ID>1</ID>
     <Density>3</Density>
     <Parameter>
           <Element>Alloy</Element>
     </Parameter>
</Part>

Ich möchte ein XSL erstellen, das dieses XML so umwandelt, dass

ID 1
Density 3
Element Alloy

Wie kann ich das tun? Jemand kann mir dabei helfen...

3voto

AnthonyWJones Punkte 182582

Sie geben den gewünschten Ausgabetyp nicht an, aber ich tippe mal auf HTML, nicht dass es darauf ankäme, die gleichen Prinzipien können verwendet werden. Ich gehe auch davon aus, dass die Parameter Element kann eine Vielzahl von Elementen mit unterschiedlichen Tag-Namen enthalten.

Hier ist also die Umwandlung:-

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

    <xsl:template match="Part">
        <html>
            <div>
                <xsl:text>ID </xsl:text>
                <xsl:value-of select="ID" />
            </div>
            <div>
                <xsl:text>Density </xsl:text>
                <xsl:value-of select="Density" />
            </div>
            <xsl:for-each select="Parameter/*">
                <div>
                    <xsl:value-of select="name()" />
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="." />
                </div>
            </xsl:for-each>
        </html>
    </xsl:template>

</xsl:stylesheet>

3voto

Eamon Nerbonne Punkte 45041

Eine kürzere Umwandlung, die einige praktische Techniken für diese Art von Dingen veranschaulicht:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:strip-space elements="*"/>    
<xsl:variable name="newline"><xsl:text>
</xsl:text></xsl:variable>

<xsl:template match="text()">
  <xsl:value-of select="concat(local-name(..),' ',normalize-space(.),$newline)"/>
</xsl:template>

</xsl:stylesheet>
  • strip-space bedeutet, dass alle Knoten, die nur aus Leerzeichen bestehen, ignoriert werden.
  • Sie können Funktionen wie local-name mit Parametern versehen.
  • Bei der Erzeugung von Textausgaben ist eine Variable wie $newline oft sehr nützlich.

Optional können durch Hinzufügen der folgenden Transformation alle nicht blattförmigen Textknoten ignoriert werden:

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

2voto

Lachlan Roche Punkte 25262

In diesem Beispiel werden der Name und der Textinhalt dieser Elemente ohne untergeordnete Elemente wiedergegeben.

Die Ausgabe weist folgende Merkmale auf:

  • verwendet local-name(), um die Ausgabe von Namespace-Präfixen zu vermeiden, z.B. für <xsl:text/> dies ist "Text"
  • verwendet normalize-space(), um führende und nachgestellte Leerzeichen zu entfernen und um Sequenzen von internen Leerzeichen zu verdichten
  • xsl:strip-space zum Ignorieren von Textknoten mit nur Leerzeichen in der Eingabe
  • CRLF-Zeilenende
  • Ausgabemethode ist Text

Beispiel-Code:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" />
    <xsl:strip-space elements="*" />

    <xsl:template match="*[not(*)]">
        <xsl:value-of select="local-name()" />
        <xsl:text> </xsl:text>
        <xsl:value-of select="normalize-space(.)" />
        <xsl:text>&#10;&#13;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

2voto

Als Alternative zu Lachlans Code könnten Sie auch versuchen

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

<xsl:template match="text()">
  <xsl:if test="normalize-space(.)">
    <xsl:value-of select="local-name(parent::*)" />
    <xsl:text> </xsl:text>
    <xsl:value-of select="normalize-space(.)" />
    <xsl:text>
</xsl:text>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>

1voto

johnwards Punkte 1871

Sie müssen sich die Funktion name() ansehen.

<xsl:value-of select="name()"/>

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