Aufrufen derselben XSL: Vorlage für verschiedene Knotennamen desselben komplexen Typs

StackOverflow https://stackoverflow.com/questions/2509529

  •  22-09-2019
  •  | 
  •  

Frage

Ich versuche, mein XSL trocken zu halten, und als Ergebnis wollte ich die gleiche Vorlage für 2 Abschnitte eines XML -Dokuments aufrufen, die zufällig denselben komplexen Typ sind (ContactDetails und AltContactDetails). Angesichts der folgenden XML:

<?xml version="1.0" encoding="UTF-8"?>
<RootNode>
    <Name>Bob</Name>
    <ContactDetails>
        <Address>
            <Line1>1 High Street</Line1>
            <Town>TownName</Town>
            <Postcode>AB1 1CD</Postcode>
        </Address>
        <Email>test@test.com</Email>
    </ContactDetails>
    <AltContactDetails>
        <Address>
            <Line1>3 Market Square</Line1>
            <Town>TownName</Town>
            <Postcode>EF2 2GH</Postcode>
        </Address>
        <Email>bob@bob.com</Email>
    </AltContactDetails>
</RootNode>

Ich habe wie folgt ein XSL Stylesheet geschrieben:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <PersonsName>
            <xsl:value-of select="RootNode/Name"/>
        </PersonsName>
        <xsl:call-template name="ContactDetails">
            <xsl:with-param name="data"><xsl:value-of select="RootNode/ContactDetails"/></xsl:with-param>
            <xsl:with-param name="elementName"><xsl:value-of select="'FirstAddress'"/></xsl:with-param>
        </xsl:call-template>
        <xsl:call-template name="ContactDetails">
            <xsl:with-param name="data"><xsl:value-of select="RootNode/AltContactDetails"/></xsl:with-param>
            <xsl:with-param name="elementName"><xsl:value-of select="'SecondAddress'"/></xsl:with-param>
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="ContactDetails">
        <xsl:param name="data"></xsl:param>
        <xsl:param name="elementName"></xsl:param>
        <xsl:element name="{$elementName}">
            <FirstLine>
                <xsl:value-of select="$data/Address/Line1"/>
            </FirstLine>

            <Town>
                <xsl:value-of select="$data/Address/Town"/>
            </Town>
            <PostalCode>
                <xsl:value-of select="$data/Address/Postcode"/>
            </PostalCode>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Wenn ich versuche, das Stylesheet auszuführen, beschwert sich ich mich bei mir, dass ich:

Verwenden Sie ein Ergebnisbaumfragment in einem Pfadausdruck, verwenden Sie entweder EXSL: Knotenset () oder geben Sie Version 1.1 an

Ich möchte nicht zu Version 1.1 gehen. Weiß jemand also, wie man den EXSL: Node-Set () für das obige Beispiel funktioniert?

Oder wenn jemand einen besseren Weg kennt, um dieselbe Vorlage auf 2 verschiedene Abschnitte anzuwenden, würde mir das auch wirklich helfen?

Vielen Dank

Dave

War es hilfreich?

Lösung

Sie rollen dies vom falschen Ende auf (das falsche Ende ist fast immer: Versuch, das imperative Programmierparadigma auf XSLT anzuwenden).

Dies ist wirklich einfach über die Matching -Matching von Vorlagen zu tun.

<xsl:template match="RootNode">
  <PersonsName>
    <xsl:value-of select="Name"/>
  </PersonsName>
  <xsl:apply-templates select="ContactDetails|AltContactDetails" />
</xsl:template>

<xsl:template match="ContactDetails|AltContactDetails">
  <xsl:copy>
    <FirstLine>
      <xsl:value-of select="Address/Line1"/>
    </FirstLine>
    <Town>
      <xsl:value-of select="Address/Town"/>
    </Town>
    <PostalCode>
      <xsl:value-of select="Address/Postcode"/>
    </PostalCode>
  </xsl:copy>
</xsl:template>

Lassen Sie die Vorstellung los, dass Sie dem XSLT -Prozessor mitteilen müssen, was zu tun ist (indem Sie benannte Vorlagen machen und sie "imperativen Stil" machen).

Der XSLT -Prozessor wählt die Vorlagen aus. An der Wurzel beginnen (/) Es prüft rekursiv nach Anpassungsvorlagen für jeden Knoten, den es besucht. Es durchquert Ihr Eingangs -XML alleine - Ihr einziger Job ist es, sie mit passenden Vorlagen für die Knoten zu versorgen, die Sie auf besondere Weise verarbeitet haben möchten.

Sie können eine benutzerdefinierte Vorlage für die Knoten eingeben, die eine besondere Behandlung benötigen, und Ihrem XSLT -Prozessor vertrauen, wenn sie sie anrufen, sobald sie angekommen sind. Alles, was Sie in Ihren Vorlagen sicherstellen müssen, ist, dass die Traversal durch die Erklärung eines angemessenen Deklikationsunternehmens weitergeht <xsl:apply-templates />.

Andere Tipps

Warum nicht die Vorlage machen

<xsl:template match="ContactDetails|AltContactDetails">

Und machen Sie den Test, um den Namen des Ausgabeelements in der Vorlage zu bestimmen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top