3 Stimmen

wie man in XSLT durch XML-Parameter iteriert

Ich habe eine XML-Datei, die ich mit XSLT transformiere. Ich übergebe ein XML als Parameter an die XSLT über C#. Der Name des Parameters ist attachment und er enthält XML. Es ist wie folgt geschrieben:

StringWriter sw = new StringWriter(); 
XmlTextWriter w = new XmlTextWriter(sw); 
w.WriteStartElement("root"); 
if (!string.IsNullOrEmpty(sWordFileName)) { 
    w.WriteStartElement("mylink", sWordFileName); 
    w.WriteEndElement(); 
}
if (!string.IsNullOrEmpty(sPDFFileName)) { 
    w.WriteStartElement("mylink", sPDFFileName);
    w.WriteEndElement();
}
w.Close();
XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));
XPathNavigator nav = doc.CreateNavigator();
_exportSet[currentExportSet].Format.ParamList["attachment"] = nav.Select("./*");

Mein xml-Parameter sieht wie folgt aus

<root><attachment xmlns=file1><attachment xmlns=file2></root>

In XSLT muss ich nun durch diesen XML-Parameter iterieren und einen Link erstellen.

Hier ist mein XSLT

<?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="2.0" xmlns:xsl="w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
        xmlns:my-scripts="urn:my-scripts" 
        xmlns="factiva.com/fcs/schemas/newsSummaries">

        <xsl:param name="attachment"/>
        <xsl:for-each select="$attachment">  
            <a target="_blank" href="#"><xsl:copy-of select="."/></a>  
         </xsl:for-each>
     </xsl:stylesheet>

Aber es wird keine Verbindung hergestellt.

2voto

justkt Punkte 14360

Ein XSLT-Parameter ist etwas anderes als ein XML-Tag-Name. Parameter werden über das Tag übergeben, wie beschrieben aquí .

Wie in den Kommentaren unten angegeben, unterscheidet sich dieses Problem nicht allzu sehr von dem, was in dem obigen Link angegeben ist.

StringWriter sw = new StringWriter(); 
XmlTextWriter w = new XmlTextWriter(sw); 
w.WriteStartElement("root"); 
if (!string.IsNullOrEmpty(sWordFileName)) { 
    w.WriteStartElement("attachment", sWordFileName); 
    w.WriteAttributeString("name", sWordFileName);
    w.WriteEndElement(); 
}
if (!string.IsNullOrEmpty(sPDFFileName)) { 
    w.WriteStartElement("attachment");
    w.WriteAttributeString("name", sPDFFileName);
    w.WriteEndElement();
}
w.WriteEndElement();
w.Close();
XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));
XPathNavigator nav = doc.CreateNavigator();

XsltArgumentList xslArg = new XsltArgumentList();
xslArg.AddParam("attachment","",nav);

Hier wäre XSL zu entsprechen pro Zugriff auf Parameter, die Mark-up enthalten :

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
   xmlns:xsl="w3.org/1999/XSL/Transform"
   xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
   xmlns:my-scripts="urn:my-scripts" 
   xmlns="factiva.com/fcs/schemas/newsSummaries">
    <xsl:param name="attachment" />

    <xsl:template match="/">
        <xsl:apply-templates select="$attachment"/>
    </xsl:template>
    <xsl:template match="attachment">
        <a target="_blank" href="{@name}">{@name}</a>
    </xsl:template>

</xsl:stylesheet>

2voto

ChrisJ Punkte 5061

Sie sollte lauten <xsl:for-each select="attachment">... . Es gibt keine $ Zeichen, weil attachment ist der Name eines XML-Elements, nicht einer Variablen.


EDIT, nachdem Sie das vollständige XSLT und XML angegeben haben.

Es gibt mehrere Probleme mit Ihrem XML:

  • Alle Tags sollten geschlossen werden.
  • Sie dürfen nicht die xmlns für alles andere, wofür es gedacht ist - Namespaces.
  • Die Attributwerte müssen in Anführungszeichen gesetzt werden

Eine korrekte Version der XML-Datei wäre also (zum Beispiel):

<root>
  <attachment ptr="file1" />
  <attachment ptr="file2" />
</root>

Die XSLT-Datei hat auch einige Probleme:

  • Le site xsl Namespace sollte an den genauen URI gebunden sein http://www.w3.org/1999/XSL/Transform .
  • Sie müssen mindestens über eine Vorlage damit die XSLT-Transformation Ihr Eingabe-XML-Dokument verarbeitet.

Eine korrekte Version wäre zum Beispiel folgende:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
    <xsl:for-each select="attachment">  
      <a target="_blank" href="{@ptr}"><xsl:value-of select="@ptr" /></a>  
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Ich bin mir nicht sicher, ob es genau das ist, was Sie wollen, aber für das obige Dokument ergibt sich das folgende Fragment:

<a target="_blank" href="file1">file1</a>
<a target="_blank" href="file2">file2</a>

2voto

Sie können jeden XPath/XSLT-Datentyp als Parameter übergeben . Wie man das macht, hängt ganz von der Implementierung des XSLT-Prozessors ab.

Als Beweis dieses Stylesheet, mit beliebiger Eingabe (nicht verwendet):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="attachment" select="document('parameter.xml')/root"/>
    <xsl:template match="/">
        <xsl:apply-templates select="$attachment"/>
    </xsl:template>
    <xsl:template match="attachment">
        <a target="_blank" href="{@href}">Link</a>
    </xsl:template>
</xsl:stylesheet>

Und parameter.xml Ressource als:

<root>
    <attachment href="file1"/>
    <attachment href="file2"/>
</root> 

Ausgabe:

<a target="_blank" href="file1">Link</a>
<a target="_blank" href="file2">Link</a>

0voto

sturdynut Punkte 618

Sie sollten den Wert des Attributs, das den Link enthält, wie folgt eingeben:

<xsl:value-of select="@YourAttribute"/>

Damit wird ein Attribut für das aktuelle Xml-Element ausgewählt.

0voto

vissi Punkte 2356

Der von Ihnen gepostete Code ist nicht ganz korrekt. Wo sind die Anführungszeichen, was ist $attachment? Wahrscheinlich haben Sie vergessen, den Namespace zu erwähnen, um korrekt auszuwählen, müssen Sie schreiben select="//file1:attachment" oder etwas Ähnliches.

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