2010-12-29 5 views
2

Ich habe einen Knotenmenge in einer Variablen gespeichert, wie untenWie bekomme ich den Knoten von einem Knotensatz, der einem Attributwert entspricht?

<xsl:variable name="myXML"> 
<list> 
<input name="First" elementName="FirstName" option="one" /> 
<input name="Second" elementName="SecondName" option="Two" /> 
<input name="Third" elementName="ThirdName" option="Three" /> 
<input name="Fourth" elementName="FourthName" option="Four" /> 
</list> 
</xsl:variable> 

My Code abruft unter den Knoten und seine Attribute korrekt. Aber die for-each im folgenden Code wiederholt sich auch nach dem Finden der Übereinstimmung, bis es den letzten <input> Knoten erreicht. Also, wenn ich eine große Liste mit vielen <input> Knoten in meinem Knoten-Set habe, kann es zu Leistungsproblemen führen. Ich muss den untenstehenden Code viel einfacher re-Faktor, möglicherweise ohne For-Each.

<xsl:template match="/"> 
<xsl:variable name="checkName" select="'Third'" /> 
<xsl:variable name="getNode"> 
<xsl:for-each select="$myXML/list/input"> 
    <xsl:if test="./@name=$checkName"> 
    <xsl:copy-of select="." /> 
    </xsl:if> 
</xsl:for-each> 
</xsl:variable> 
<xsl:variable name="element" select="$getNode/input/@elementName" /> 
<xsl:variable name="option" select="$getNode/input/@option" /> 
<element><xsl:value-of select="$element" /></element> 
<option><xsl:value-of select="$option" /></option> 
</xsl:template> 

Alles, was ich wollte, ist, habe ich eine Eingangsgröße Checkname = „Third“ und ich brauche, um den Wert des ‚element‘ Attribute und ‚Option‘ in zwei verschiedenen Variablen, die den Wert im Namensattribut entspricht der der <input> Knoten. Bitte helfen Sie mir mit einer Lösung und ich möchte auch nicht Exslt oder andere Erweiterungen verwenden.

+2

Welche XSLT 1.0 Prozessor verwenden Sie? In meinem Verständnis von XSLT 1.0 ist die Variable mit dem Namen 'myXML' vom Typ result tree fragment, und doing' for-select = "$ myXML/list/input" 'sollte bei einem XSLT 1.0-Prozessor einen Fehler verursachen. –

+0

Gute Frage, +1. Sehen Sie meine Antwort für eine einfache Lösung, die viel kürzer und effizienter als Ihr aktueller Code ist. :) –

Antwort

-1

Verwenden a predicate Filter die @name an die checkName Variable zu vergleichen. einfache XPath-Anweisungen

Das Stylesheet stark durch Entfernen der for-each und zusätzliche Variablen vereinfacht werden kann verwenden:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:variable name="myXML"> 
     <list> 
      <input name="First" elementName="FirstName" option="one" /> 
      <input name="Second" elementName="SecondName" option="Two" /> 
      <input name="Third" elementName="ThirdName" option="Three" /> 
      <input name="Fourth" elementName="FourthName" option="Four" /> 
     </list> 
    </xsl:variable> 

    <xsl:template match="/"> 
     <xsl:variable name="checkName" select="'Third'" /> 
     <element><xsl:value-of select="$myXML/list/input[@name=$checkName]/@elementName" /></element> 
     <option><xsl:value-of select="$myXML/list/input[@name=$checkName]/@option" /></option> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Danke! beide Antworten haben mir geholfen ... – dhinu

+2

Dies ist keine XSLT 1.0 Lösung. Sie können den Operator '/' nicht mit RTF verwenden. –

+0

@ Alejandro - Ja, Sie haben Recht. Es ist passiert, dass es für mich in oXygen mit Saxon 9.2 funktioniert, aber die Variable als RTF zu verwenden ist nicht Standard 1.0. @dhinu hat es benutzt, also nehme ich an, es funktioniert für ihn/sie. –

1

Mein Code unten ruft den Knoten und seine Attribute korrekt ab. Aber die For-Each in der unteren Code wiederholt auch nach dem Finden der Übereinstimmung, bis es erreicht den letzten Knoten. Also wenn ich eine große Liste mit vielen Knoten in meinem Knoten-Set habe, kann es Leistungsproblem verursachen. Ich muss den folgenden Code viel einfacher neu einteilen, kann ohne for-each sein.

<xsl:variable name="getNode"> 
<xsl:for-each select="$myXML/list/input"> 
    <xsl:if test="./@name=$checkName"> 
     <xsl:copy-of select="." />  
    </xsl:if> 
</xsl:for-each> 
</xsl:variable> 

Verwenden:

<xsl:variable name="getNode" select="$myXml/list/input[@name=$checkName]"/> 
Verwandte Themen