2016-03-30 4 views
0

Ich habe diese XML:Ich verstehe nicht, warum ich keinen Spielraum für diese globale Variable habe und gibt es eine Alternative?

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="aj.xsl"?> 
<Test> 
    <Highlight> 
    <HighlightName>Name 1</HighlightName> 
    <HighlightName>Name 2</HighlightName> 
    <HighlightName>Name 3</HighlightName> 
    <HighlightName>Name 5</HighlightName> 
    <HighlightName>Name 6</HighlightName> 
    </Highlight> 
    <Date> 
    <Name>Name 1</Name> 
    </Date> 
    <Date> 
    <Name>Name 6</Name> 
    </Date> 
    <Date> 
    <Name>Name 2</Name> 
    </Date> 
    <Date> 
    <Name>Name 7</Name> 
    </Date> 
    <Date> 
    <Name>Name 3</Name> 
    </Date> 
    <Date> 
    <Name>Name 8</Name> 
    </Date> 
    <Date> 
    <Name>Name 4</Name> 
    </Date> 
    <Date> 
    <Name>Name 9</Name> 
    </Date> 
    <Date> 
    <Name>Name 5</Name> 
    </Date> 
</Test> 

Und einige Test XSL:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" indent="yes" version="4.01" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> 
    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <head> 
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
     <link rel="stylesheet" type="text/css" href="Workbook-S-140-Version2.css"/> 
     <title>Test</title> 
     </head> 
     <body> 
     <xsl:for-each select="Test/Highlight/HighlightName"> 
      <xsl:variable name="strHighlightName" select="."/> 
      <p>Start of list for {$strHighlightName}</p> 
      <xsl:for-each select="Test/Date"> 
      <xsl:apply-templates select="Name"/> 
      </xsl:for-each> 
     </xsl:for-each> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="Name"> 
    <p> 
     <xsl:if test="$strHighlightName=."> 
     <xsl:text>**</xsl:text> 
     </xsl:if> 
     <xsl:value-of select="."/> 
    </p> 

    </xsl:template> 
</xsl:stylesheet> 

Die Probe kurz ist, das Problem zu vermitteln. Im letzten Szenario sind meine Dateien detaillierter.

Das Grundkonzept, das ich zu implementieren versuchte, bestand darin, eine Liste bekannter Namen durchzugehen, die ich hervorheben wollte. Dann wollte ich unter anderem angeben, ob einer der anderen Namen einer der hervorgehobenen Namen ist. Also habe ich das obige versucht, aber leider ist die Variable strHighlightName nicht sichtbar für die Name Vorlage.

Ich weiß, ich kann Parameter verwenden und den Wert in die Vorlage einspeisen, aber in der realen Welt würde ich diesen Parameter alle den Weg hinunter in die Vorlage kaskadieren müssen Anrufe Name.

Da ich diesen Ansatz nicht verwenden kann, kann ich es anders machen? Zum Beispiel kann ich stattdessen Folgendes tun:

<xsl:template match="Name"> 
    Does "." match any of the names in the "//Highlight/HighlightName" section? 
    If yes 
     Text "** " 
</xsl:template> 

Macht das Sinn? Es würde die Notwendigkeit für eine Variable und/oder Weitergabe Parameter vermeiden.

Vielen Dank.

Antwort

1
I realise I can use parameters and feed the value in to the template, but in the real world I would have to cascade this param all the way down into the template can calls Name. 

In XSLT 1.0, Kaskadierung durch alle Zwischenvorlagen ist, was Sie tun müssen.

In XSLT 2.0 können Sie Tunnelparameter verwenden, die von der ersten Vorlage zur zweiten durchtunneln, ohne dass sie in allen dazwischenliegenden explizit erwähnt werden müssen.

Überprüfen Sie, ob in Ihrer Anwendungsumgebung ein XSLT 2.0-Prozessor verfügbar ist.

Verwandte Themen