2016-09-29 6 views
2

Ich habe eine Haupt-Xslt, die cdcatalog.xsl ist und mit Xml-Datei cdcatalog.xml verknüpft.
Ich versuche, Vorlagen dynamisch basierend auf dem Wert in country anzuwenden. Einige der tatsächlichen Vorlagen sind externe .xsl Dateien.XSL-Vorlage dynamisch anwenden. Vorlage ist in externen Xslt-Datei und in Main Xslt

cdcatalog.xsl

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:include href="cdcatalog_in.xsl"/> 
    <xsl:include href="cdcatalog_usa.xsl"/> 
    <xsl:include href="cdcatalog_uk.xsl"/> 
    <xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <xsl:apply-templates /> 
    </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="cd"> 
    <p> 
    <xsl:apply-templates select="title"/> 
    <xsl:apply-templates select="artist"/> 
    </p> 
    </xsl:template> 

    <xsl:template match="title"> 
    Title: <span style="color:#ff0000"> 
    <xsl:value-of select="."/></span> 
    <br /> 
    </xsl:template> 

    <xsl:template match="artist"> 
    Artist: <span style="color:#00ff00"> 
    <xsl:value-of select="."/></span> 
    <br /> 
    </xsl:template> 

    </xsl:stylesheet> 

cdcatalog.xml Inhalte sind wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
    <?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> 
    <catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     <country>USA</country> 
     <company>Columbia</company> 
     <price>10.90</price> 
     <year>1985</year> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     <country>UK</country> 
     <company>CBS Records</company> 
     <price>9.90</price> 
     <year>1988</year> 
    </cd> 
    <cd> 
     <title>Greatest Hits</title> 
     <artist>Dolly Parton</artist> 
     <country>USA</country> 
     <company>RCA</company> 
     <price>9.90</price> 
     <year>1982</year> 
    </cd> 
    <cd> 
     <title>Still got the blues</title> 
     <artist>Gary Moore</artist> 
     <country>IN</country> 
     <company>Virgin records</company> 
     <price>10.20</price> 
     <year>1990</year> 
    </cd> 
    </catalog> 

cdcatalog_in.xsl Inhalte sind wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="cd[country='IN']" name="IN" > 
<h4>Country: India</h4> 
</xsl:template> 
</xsl:stylesheet> 

cdcatalog_usa.xsl Inhalte sind wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="cd[country='USA']" name="USA" > 
<h4>Country: United States of America</h4> 
</xsl:template> 
</xsl:stylesheet> 

cdcatalog_uk.xsl Inhalte sind wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="cd[country='UK']" name="UK" > 
<h4>Country: United Kingdom</h4> 
</xsl:template> 
</xsl:stylesheet> 

Erwartete Ausgabe

Title : Empire Burlesque 
Artist: Bob Dylan 
Country: United States of America 

Title : Hide your heart 
Artist: Bonnie Tyler 
Country: United Kingdom 

Title : Greatest Hits 
Artist: Dolly Parton 
Country: United States of America 

Title : Still got the blues 
Artist: Gary Moore 
Country: India 

Ge tting unter Ausgabe, die

My CD Collection 

Country: United States of America 2 

Country: United Kingdom 

Country: United States of America 2 

Country: India 

Vielen Dank im Voraus nicht korrekt ist. Srini

Antwort

1

Haben Sie die Möglichkeit, die im Lieferumfang enthaltenen XSLT-Dateien zu ändern? Wenn ja, könnten Sie sie so ändern, dass sie auf country anstelle von cd passt. Zum Beispiel die cdcatalog_in.xsl Datei würde wie folgt aussehen:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="cd/country[.='IN']"> 
    <h4>Country: India</h4> 
    </xsl:template> 
</xsl:stylesheet> 

Dann in Ihrem Haupt-XSLT-Datei, die Vorlage cd passende ähnliche

<xsl:template match="cd"> 
<p> 
    <xsl:apply-templates select="country"/> 
    <xsl:apply-templates select="title"/> 
    <xsl:apply-templates select="artist"/> 
</p> 
</xsl:template> 

aussehen würde Sie könnten sogar ein Template-Matching fügen Sie einfach passende country in der Haupt XSLT auch zu erfassen "unbekannt" Fälle

<xsl:template match="country"> 
    <h4>Country: UNKOWN</h4> 
</xsl:template> 
+0

Gut zu handhaben Unbekannter Fall – Rao

+0

Anstatt "UNKNOWN" zu zeigen, wenn die entsprechende Vorlage fehlt, wird wahrscheinlich der gleiche Ländercode angezeigt? – Rao

+0

diese Lösung funktioniert gut. Außerdem befinden wir uns noch in der Entwurfsphase, sodass wir Änderungen an externen Vorlagen vornehmen können. – SriniRao

-1

Anstatt mehrere xsl-Dateien für jede Zählung zu verwenden, können alle cd Elemente in einer einzigen xsl-Vorlage verwendet werden.

Hier ist die modifizierte Einzelstylesheet:cdcatalog.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My CD Collection</h2> 
       <xsl:apply-templates /> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="cd"> 
     <p> 
      Title: <span style="color:#ff0000"> 
      <xsl:value-of select="./title"/></span><br/> 
      Artist: <span style="color:#00ff00"> 
      <xsl:value-of select="./artist"/></span><br/> 
      Country: <span style="color:#00ff11"> 
      <xsl:choose> 
       <xsl:when test="./country = 'IN'"> 
        India 
       </xsl:when> 
       <xsl:when test="./country = 'UK'"> 
        United Kingdom 
       </xsl:when> 
       <xsl:when test="./country = 'USA'"> 
        United States of America 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="./country"/> 
       </xsl:otherwise> 
      </xsl:choose> 
      </span><br/> 
     </p> 
    </xsl:template> 

</xsl:stylesheet> 

Und hier ist die Ausgabe:

enter image description here

Hope this für Ihren Bedarf arbeitet.

+0

Das Problem bei diesem Ansatz ist, dass er die Flexibilität und Wiederverwendbarkeit des Originals verliert, was vermutlich die Änderung der Liste der erkannten Länder wesentlich erleichtert. Vorlagenregeln sind für diese Art von Zweck gut; Verlasse sie nicht auf den ersten Blick der Schwierigkeit. –

+0

Vielen Dank für die Eingabe @MichaelKay. Es war nicht gedacht, die Schwierigkeit aufzugeben, konnte einfach nicht verstehen, warum viele Stylesheets verwendet wurden. Nach der Veröffentlichung meiner Antwort wurde festgestellt, dass mehrere Dateien flexibel erweiterbar sein können, wenn ein neues Land eingeführt wird, und die Änderung auf die gleiche Weise wie vom Benutzer gesucht durchgeführt wurde. Ich meine, während ich deine Antwort gefunden habe. Freut mich zu wissen und schätze dein Feedback. Und danke für den "Modus", den ich nicht kannte. – Rao

1

Modi können hier nützlich sein. Ändern Sie Ihre enthalten Template-Regeln werden wie:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="cd[country='IN']" mode="country-name"> 
    <h4>Country: India</h4> 
    </xsl:template> 
</xsl:stylesheet> 

und ändern Sie die generische Template-Regel:

<xsl:template match="cd"> 
    <xsl:apply-templates select="." mode="country-name"/> 
    <p> 
    <xsl:apply-templates select="title"/> 
    <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 
+0

Aber wenn das Problem wirklich nur Ländercodes zu Ländernamen erweitert, würde ich ein Nachschlagedokument verwenden, das die Zuordnung von Codes zu Namen definiert, anstatt es in Code zu erstellen. –

2

Problem: Sie haben zwei Vorlagen, die mit demselben Knoten übereinstimmen, und Sie müssen beide anwenden.

Lösung: Statt einschließlich der externen Stylesheets, sie Import. Verwenden Sie dann xsl:apply-imports in der lokalen Vorlage, um die importierte Vorlage anzuwenden.

Keine Modifikation der externen Stylesheets ist notwendig.

XSLT 1,0

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

<xsl:import href="cdcatalog_in.xsl"/> 
<xsl:import href="cdcatalog_usa.xsl"/> 
<xsl:import href="cdcatalog_uk.xsl"/> 

<xsl:template match="/"> 
    <html> 
     <body> 
      <h2>My CD Collection</h2> 
      <xsl:apply-templates/> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="cd"> 
    <p> 
     <xsl:apply-imports /> 
     <xsl:apply-templates select="title"/> 
     <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 

<xsl:template match="title"> 
    Title: <span style="color:#ff0000"> 
    <xsl:value-of select="."/></span> 
    <br /> 
    </xsl:template> 

<xsl:template match="artist"> 
    Artist: <span style="color:#00ff00"> 
    <xsl:value-of select="."/></span> 
    <br /> 
</xsl:template> 

</xsl:stylesheet> 

Alernatively, könnten Sie Modi verwenden - aber noch ohne die externen Stylesheets zu ändern:

XSLT 1,0

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

<xsl:include href="cdcatalog_in.xsl"/> 
<xsl:include href="cdcatalog_usa.xsl"/> 
<xsl:include href="cdcatalog_uk.xsl"/> 

<xsl:template match="/"> 
    <html> 
     <body> 
      <h2>My CD Collection</h2> 
      <xsl:apply-templates mode="first"/> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="cd" mode="first" > 
    <p> 
     <xsl:apply-templates select="." /> 
     <xsl:apply-templates select="title"/> 
     <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 

<xsl:template match="title"> 
    Title: <span style="color:#ff0000"> 
    <xsl:value-of select="."/></span> 
    <br /> 
    </xsl:template> 

<xsl:template match="artist"> 
    Artist: <span style="color:#00ff00"> 
    <xsl:value-of select="."/></span> 
    <br /> 
</xsl:template> 

</xsl:stylesheet> 
+0

Diese Lösung funktioniert. Wird es Leistungsprobleme geben? bcz apply-templates select = "." da wir keine exakte Vorlage adressieren. Danke trotzdem. – SriniRao

+0

@SriniRao Ich bin mir nicht sicher, was Sie mit "* nicht Adressierung genaue Vorlage *" meinen. Das Anwenden von Vorlagen auf den aktuellen Knoten unterscheidet sich nicht von dem Anwenden von Vorlagen auf andere Knoten. Wenn es zu Leistungsproblemen kommt, werden sie sehr wahrscheinlich durch mehrere Dateien verursacht, eine für jedes Land, als alles andere. –

+0

Anstelle von Anwendungsvorlagen wählen Sie = "." Gibt es eine Möglichkeit zu applicate-template select = "name" Damit das System diese Vorlage direkt übernimmt. – SriniRao

Verwandte Themen