Archiv verlassen und diese Seite im Standarddesign anzeigen : MSXSL Parameterübergabe
Halli hallo,
ich bin zur Zeit am verzweifeln.....
Ich möchte in einem kleinen Programm den externen MSXSL Prozessor aufrufen und ihm, für den XSLT-Stylesheet, als Parameter noch eine Anfrage mitgeben. Die Anfrage soll ein XPath Ausdruck sein, mit dem der Stylesheet dann weiter arbeitet. Nun gibt es aber immer das Problem, dass MSXSL meckert falls ich einen Parameter wie z.B. parameter="/liste/buch"
übergebe. Im Stylesheet wird nämlich die Funktion "count()" benutzt und diese verlang eine Knotenliste. Hat vielleicht jemand eine Idee, wie ich nach der Übergabe des Parameters (also des XPath Strings) im Stylesheet eine Knotenliste aufbauen könnte um sie anschließend der count()-Funktion zur Verfügung stellen zu können.
Wäre euch sehr danbar für eine Antwort....
MfG Markus
Mittels der ArgumentList via XPathNavigator: http://msdn2.microsoft.com/de-de/system.xml.xsl.xsltargumentlist.aspx
Hallo Scavi,
danke erstmal für die Antwort. Ich stehe aber leider völlig auf dem Schlauch. :confused:
Ich wäre daher sehr glücklich über etwas Beistand :) .
Also, in meinem Stylesheet habe ich einen Paramter namens "selectedNodes"
<xsl:param name="selectedNodes"/>
Dieser Parameter wird im späteren Verlauf mit Funktionen wie count(.....) Verwendet und muss daher eine Knotenliste repräsentieren.
Beim Aufruf meines Stylesheets möchte ich jedes mal eine neue Knotenliste angeben. Also mittels eines XPath Strings. Zum Beispiel sieht mein Aufruf so aus:
msxsl.exe lit.xml style.xslt -o out.html Paramter="/literaturliste/buch"
Nun muss ich nur noch eine Möglichkeit haben um aus dem String (/literaturliste/buch) eine Knotenliste zu machen, welche genau diese angeforderten Knoten darstellt.
Mit deinem Vorschlag kann ich leider nichts anfangen, da ich nur Bahnhof verstehe:( . Könntest Du mir bitte einen kleinen Tipp geben...
MfG Markus
Wie sieht das XSL-Template aus?
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:d2="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="mynamespace">
<xsl:param name="selectedNodes" select="@comment()"/>
und dann wird in Templates mit der count()-Funktion gearbeitet.
<!-- Template for pis not handled elsewhere -->
<xsl:template match="processing-instruction()">
<xsl:variable name="belongs" select="count($selectedNodes|.)-count($selectedNodes)"/>
<DIV class="e">
<SPAN class="b"> </SPAN>
<SPAN class="m"><?</SPAN>
<xsl:choose>
<xsl:when test="$belongs=0">
<SPAN class="se"><xsl:value-of select="concat(name(), ' ')"/> <xsl:value-of select="."/></SPAN>
</xsl:when>
<xsl:otherwise>
<SPAN class="pi"><xsl:value-of select="concat(name(), ' ')"/> <xsl:value-of select="."/></SPAN>
</xsl:otherwise>
</xsl:choose>
<SPAN class="m">?></SPAN>
</DIV>
</xsl:template>
so ungefähr funktioniert auch der ganze Rest......
Zum Schluss kommt dann noch ein kleiner Script Teil
<msxsl:script implements-prefix="user">
<![CDATA[
function xml(node)
{
return node(0).xml; //now();
}
function nodeType(node)
{
return node(0).nodeType();
}
function cdata(node)
{
return (node(0).nodeType() == 4); //CData == 4
}
]]>
</msxsl:script>
Funktioniert deine Parameterübergabe? Hast du dir das schonmal ausgegeben? Wenn der Parameter nur ein String und keine NodeList ist, dann musst du ihn halt mittels einem CallTemplate oder mit anderer Parameterdefinition füllen.
Probiere mal folgendes:
<xsl:param name="NamedesParameters">
<xsl:value-of select="$WertdesParameters"/>
</xsl:param>
Hiho,
ich weiß nicht ob man einen Parameter überhaupt so füllen kann. Ich dachte immer das geht nur mit Variablen. Aber ich habs trotzdem ausprobiert und er sagt immer noch, dass sich der Parameter selectedNodes auf ein Knotenset beziehen muss. :(
Rufst du den Processor so auf: msxsl.exe lit.xml style.xslt -o out.html selectedNodes="/literaturliste/buch" ?
Hast du das mal ausprobiert, was ich weiter oben gepostet habe? Gib mal deinen Parameter aus (mit foreach).
Hmm, wie meinst Du das jetzt genau?
So vielleicht?
<xsl:for-each select="$selectedNodes">
<xsl:value-of select="."/>
</xsl:for-each>
Also mit der Variante sagt er mir auch das sich der Verweis auf "selectedNodes" auf ein Knotenset beziehen muss.
Klar, du machst die Ausgabe in einem Template was du mittels CallTemplate aufrufst (mit übergebenen PARAM!). Diesen Paramter füllst du, wie ich es weiter oben vorgeschlagen habe.
Also langsam verzweifle ich......
Ich habe es nun mit einem Template versucht, dem ich den extern übergebenen Parameter mitgebe. Doch wenn ich dann innerhalb des Templates mal den Parameter ausgeben lasse, dann bekomme ich nur den String ausgegeben. Es wird immer noch kein Knotenset erzeugt. :(
<xsl:stylesheet>
<xsl:param name="selectedNodes"/>
<xsl:template name="listefuellen">
<xsl:param name="testpara"/>
<xsl:param name="liste">
<xsl:value-of select="$testpara"/>
</xsl:param>
<xsl:value-of select="$liste"/>
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="listefuellen">
<xsl:with-param name="testpara"> $selectedNodes </xsl:wirh-param>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>
Jetzt hab ich echt keine Ideen mehr :mauer:
Mach mal aus deinem Parameter "liste" eine Variable:
<xsl:variable name="liste" select="$testpara" />
Also die Version mit deinem Vorschlag mit der Variable gibt auch immer nur den übergebenen String aus:
<xsl:param name="selectedNodes"/>
<xsl:template name="listefuellen">
<xsl:param name="testpara"/>
<xsl:variable name="liste" select="$testpara"/>
<xsl:value-of select="$liste"/>
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="listefuellen">
<xsl:with-param name="testpara" select="$selectedNodes"/>
</xsl:call-template>
</xsl:template>
Kapier ich nicht. Wenn du dem Processor sagst: Suche die Nodes, dann muss er doch auch suchen :confused:
Soooo, nun werden ganz andere Seiten aufgezogen. :cool:
Wenn sich keine Weg anbieten muss man sich halt nen eigenen legen.
Ich habe im Netz folgendes kleines JScript gefunden, welches ein node-set zu einem übergebenen String zurück liefert. Nun sind meine Probleme vorerst beseitigt. *freu*
Hier der Code samt Script:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:some-prefix="some-uri"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="html"/>
<xsl:param name="selectedNodes"/>
<msxsl:script implements-prefix="some-prefix" language="jscript">
<![CDATA[
function selectNodes(nsetCtxt, strExpr){
return nsetCtxt.nextNode().selectNodes(strExpr);
}
]]>
</msxsl:script>
<xsl:template match="/">
<html>
<head/>
<body>
<xsl:variable name="ActionPathVar" select="some-prefix:selectNodes(., string($selectedNodes))"/>
<xsl:for-each select="$ActionPathVar">
<xsl:value-of select="."/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Sorry das nichts eingerückt ist, doch irgendwie will ich so schnell wie möglich weiter an meinem Code tippen :p
Ich möchte mich hiermit erstmal herzlichst für deine Hilfe bedanken Scavi. Wenn sich jeder soviel Zeit wie Du nehmen würde, gäbe es keine Probleme mehr. *übertreib* ;)
Naja, also wenn das dann nur über JScript möglich ist, sieht es mir sehr nach einen Bug aus. Vielleicht solltest du lieber mal Xalan nutzen.
PS: ...gern geschehen.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.