xsl: Kann eine benannte Vorlage return eine Liste von Knoten?
Ich bin mit einem rekursiven template, dass die Suche nach einige spezifische Elemente, wie etwa diese:
<xsl:template name="GetProdDependency">
<xsl:param name="TechProd"></xsl:param>
<xsl:param name="BeatenPath"></xsl:param>
<xsl:variable name="TechProdArch" select="$TechProd/pro:own_slot_value[pro:slot_reference='technology_product_architecture']/pro:value"></xsl:variable>
<xsl:variable name="TechProdArchNode" select="/node()/pro:simple_instance[pro:name=$TechProdArch]"></xsl:variable>
<xsl:variable name="TechProdCompList" select="$TechProdArchNode/pro:own_slot_value[pro:slot_reference='contained_techProd_components']/pro:value"/>
<xsl:for-each select="$TechProdCompList">
<xsl:variable name="TechProdAsRole" select="/node()/pro:simple_instance[pro:name=current()]/pro:own_slot_value[pro:slot_reference='technology_product_as_role']/pro:value"/>
<xsl:variable name="TechProdRole" select="/node()/pro:simple_instance[pro:name=$TechProdAsRole]/pro:own_slot_value[pro:slot_reference='role_for_technology_provider']/pro:value"/>
<xsl:variable name="DepTechProd" select="/node()/pro:simple_instance[pro:name=$TechProdRole]"/>
<!-- Check for beaten Path -->
<!-- if $DepTechProd/pro:own_slot_value[pro:slot_reference='name']/pro:value in BeatenPath -->
<xsl:if test="not($BeatenPath[string(.)=string($DepTechProd/pro:own_slot_value[pro:slot_reference='name']/pro:value)])">
<!-- Do the recursion here! -->
<!--<xsl:value-of select="$DepTechProd/pro:own_slot_value[pro:slot_reference='name']/pro:value"/> (type: <xsl:value-of select="$DepTechProd/pro:type"/> and Class: <xsl:value-of select="$DepTechProd/pro:name"/>)-->
<!--<xsl:value-of select="$DepTechProd/pro:own_slot_value[pro:slot_reference='name']/pro:value"/>-->
<xsl:value-of select="$DepTechProd"/>
<xsl:call-template name="GetProdDependency">
<xsl:with-param name="TechProd" select="$DepTechProd"></xsl:with-param>
<xsl:with-param name="BeatenPath" select="$TechProd|$DepTechProd/pro:own_slot_value[pro:slot_reference='name']/pro:value"></xsl:with-param>
<xsl:with-param name="Rev" select="$Rev + 1"></xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template>
Dies ist in Ordnung, die in der Suche etc.
Aber wenn ich das Ergebnis bekommen, das in den ursprünglichen Aufrufer, ich hatte erwartet, um eine Liste von Knoten aus dem Aufruf.
Nenne ich es gerne:
<xsl:variable name="DelPlist">
<xsl:call-template name="GetProdDependency">
<xsl:with-param name="TechProd" select="$TechProd"></xsl:with-param>
<xsl:with-param name="BeatenPath" select="$TechProd/pro:own_slot_value[pro:slot_reference='name']/pro:value"></xsl:with-param>
<xsl:with-param name="Rev" select="1"></xsl:with-param>
</xsl:call-template>
</xsl:variable>
Und ich hatte erwartet, um eine Liste der Knoten, die ich können Durchlaufen mit <xsl:for-each>
. Aber Wenn ich die Option für die count($DelPlist)
bekomme ich 1 als Ergebnis, und ich kann nicht Durchlaufen.
Kann jemand helfen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie den Typ des Ergebnisses der Vorlage in seiner
as
Attribut.Falls nicht angegeben, wird der Typ
document-node()
und dann, um es zu Durchlaufen, das Ergebnis, die Sie brauchen, um den Kindern das Ergebnis.Lösung: Geben Sie den return-Typ der Vorlage mit einem
as
Attribut.Hier ist ein vollständiges Beispiel:
wenn diese transformation wird angewendet auf beliebigen XML-Dokument (nicht verwendet), die wollten, das richtige Ergebnis produziert wird:
<xsl:stylesheet version="2.0" ...
und diskutiert syntax, wie dieas
Attribut ist nur definiert in XSLT 2.0.Die Antwort auf deine Frage ist: in XSLT 2.0 ist ja in XSLT 1.0 nicht.
In XSLT 2.0, die beide Vorlagen und Funktionen zurückkehren können einen beliebigen Wert. Der Typ des Ergebnisses angegeben werden können, die mithilfe des Attributs (z.B. as="node()*"), und Sie können das xsl:sequence Unterricht, das Ergebnis ist das Ergebnis einer XPath-Ausdruck.
In XSLT 1.0, wenn Sie erfassen das Ergebnis von xsl:call-template in einer variable, den Wert der Variablen wird immer ein result tree fragment.
Sorry für die Mühe.
Konnte ich erreichen, was erfüllt meine Anforderung in den folgenden amnner:
Und konnte Durchlaufen der Knotenliste als:
Es erfüllt meine Anforderung.
Möglich in xsl 1.0 mit exslt:node-set (unterstützt von den meisten xslt-Prozessoren):
Ausgang (getestet in libxslt, xalan, saxon, msxml):