Wie wählen Sie die Großeltern eines Knotens unter Verwendung von xslt
Ich bin in einer situation, wo ich nur kann-test für die Kind-Knoten, aber ich habe tags angewendet, um die Großeltern des Kind-Knotens.
Habe ich versucht mit:
<xsl:call-template name="grandparent" select="parent::parent::node()"/>
und:
<xsl:call-template name="grandparent" select="ancestor::node [@nameofgrandparentnode]"/>
Aber klappt beides nicht.
Ebene der Großeltern Knoten ist nicht fest, so dass ich vermute, ich kann nicht mit [@level=#] entweder. Irgendwelche Ideen auf wie Sie wählen, es würde sehr geschätzt werden.
EDIT: -- Dieser Artikel wurde geschrieben, als eine neue Frage:
xslt-wählen Sie Großeltern Knoten in Abhängigkeit von einem Attributwert von seinem Enkel Knoten
Auswahl der Knoten mit Hilfe der Vorschläge von unten gearbeitet. Danke! Allerdings brauche ich auch, um zu testen, indem Sie das Attribut der Großeltern oder Enkel-Knoten.
Ich versucht habe:
<xsl:template name"one" match="grandparentnode">
<Tag1>
<xsl:apply-templates select="parentNode" />
</Tag1>
</xsl:template>
<xsl:template name="two" match="grandparentnode[*/*/@grandchildattr='attrValue']">
<Tag2>
<xsl:apply-templates select="parentNode" />
</Tag2>
</xsl:template>
Jedoch die Vorlage "zwei" immer aufgerufen wird, und "" wird immer eingefügt. Auch für die Enkel-Knoten, dessen Attribut-Wert ist nicht gleich "attrValue'.
Bin ich hier etwas fehlt?
- Gute Frage (+1). Siehe meine Antwort für eine Anzahl von XPath-Ausdrücken, die Sie verwenden können
<xsl:param>
Unterricht. - Der bearbeitete Teil ist nicht klar. Bitte geben Sie eine vollständige (aber möglichst kurz) XML-Dokument und die vollständige XSLT-stylesheet (mal wieder, so kurz wie möglich), dass repro-Ihr problem. Optimalerweise Fragen Sie diese in eine neue Frage.
- Auch
Even for grandchild nodes whose attribute value is not equal to 'attrValue'
kann nicht wahr sein mit diesem Mustergrandparentnode[*/*/@grandchildattr='attrValue']
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicherlich wird es nicht "Arbeit", weil die
<xsl:call-template>
Unterricht nichtselect
Attribut!Können Sie Parameter übergeben, mit
<xsl:with-param>
Kinder der<xsl:call-template>
Anweisung, wie diese:Für die
select
Attribut des<xsl:with-param>
Verwenden:Für eine echte Großeltern:
für das nächste Vorfahren-element mit dem Namen
someName
:für das nächste Vorfahren-element mit dem Namen enthielt, die in der variable
$ancName
:XSLT ist nicht prozeduralen Programmierung, so haben Sie zu denken, die Dinge ein wenig anders.
Wenn ich das richtig verstehe, Sie wollen, um zu injizieren, neue tags (zusätzliche untergeordnete Elemente oder Attribute?) in Ihren XML -, aber Sie wollen, fügen Sie es zu einem Vorfahren, wenn Sie einen bestimmten Nachkommen. Dein Beispiel-code angezeigt wird, um zu versuchen, um das Ziel Großeltern, sobald Sie über das Kind. Leider kann dies zu spät sein.
Müssen Sie möglicherweise Spritzen Sie das neue element/Attribut an, wenn der Motor kommt über das element, das Sie ändern möchten (die Großeltern in Ihrem Fall), nicht, wenn es darum geht über das Kind, das entspricht der Bedingung (sonst werden Sie am Ende hinzufügen von Elementen oder Attributen auf das Kind)
Betrachten Sie diese Eingabe (Großeltern="album", Enkel="label"):
Ich ändern möchten die
album
abhängig, ob eine bestimmtelabel
vorhanden ist. Denken Sie daran, die Allgemeine format für targeting-Knoten ist:target-node[target-condition]
. Ändernalbum
ElementeCapitol
label Enkel-element, würde ich dieses verwenden:So betrachten Sie dieses stylesheet hinzufügen eines neuen Attributs-und 2 neue Kind-Elemente
album
's, die meinem Zustand:Ausgang (manuell formatiert):
Einige sandbox-test-Ressourcen:
<album new-attribute="A Capitol Record">
xsl:template
mehreren aufeinander abgestimmten Elementen, z.B.album[...]|single[...]
und zu halten/zu kopieren, was gefunden wurde, und (2)album
möglicherweise Attribute haben, die wir behalten wollen/kopieren zusätzlich zum hinzufügen ein neues Attribut.