Match-Attribut auf XSLT, anstatt das ganze element matching
Ich schreiben möchte eine XSL-Vorlage entspricht, Attribute anstelle von Knoten,
Ich würde denken, dass so etwas wie dieses:
<xsl:template match="@href | @conref | @conrefend">
<xsl:message select="."/>
</xsl:template>
wäre mit einem von denen 3 Attribut-Namen und-print auf der Konsole der Wert des Attributs, wie der Umfang ist das Attribut selbst und nicht einen Knoten.
Aber mein Test hat mich eines besseren belehrt und ich bin nur in der Lage, mit Knoten, die enthalten alle diese Attribute so:
<xsl:template match="*[@href or @conref or @conrefend]">
<xsl:message select="if(not(@href))
then
if(not(@conref))
then @conrefend
else @conref
else @href"/>
</xsl:template>
Das problem bei diesem Ansatz ist, dass, wenn es existiert ein Knoten, der mehr als eines dieser Attribute, dann wird nur eine verarbeitet und ich brauche alle zu verarbeiten.
Irgendwelche Ideen, warum der erste Ansatz nicht funktioniert?
EDIT1:
Vollständige xslt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@conref|@conrefend|@href">
<xsl:message select="."/>
</xsl:template>
</xsl:stylesheet>
Test-XML:
<links>
<image conref="COPY-GUID/*+-862416}39-37CD-4CF7-A7AA-F09F4A763944" />
</links>
Jetzt die XSLT-Datei wird nicht passen alles.
InformationsquelleAutor rovinos | 2015-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie in der Tat entsprechen die Attribute in Ihren Vorlagen, wie Sie Ihre erste Vorlage hat. Etwas anderes falsch sein muss...
Werfen Sie einen Blick auf die Einheitsmatrix:
Funktioniert es passende alternativen, wie Sie tun, und eine der alternativen ist für alle Attribute (
@*
).Betrachten wir nun die
xsl:apply-templates
- Anweisung. Beachten Sie, wie@*
wird explizit hervorgehoben. Sind Sie sicher, dass Sie geben Sie Ihre Vorlage eine chance, das anzuwenden, um die Attribute? Wenn Sie anrufen,xsl:apply-templates
wie diese zum Beispiel:erkennen, dass nur Elemente ausgewählt werden, keine Attribute. Beachten Sie auch, dass
node()
keine Attribute.Update
Recht. Ihre Attribut-matching-Vorlage hat niemals eine chance, sich zu bewerben.
Fügen Sie die Identität Vorlage oben, oder so etwas wie dieses:
geben Sie Ihre Attribut-matching-Vorlage eine chance, sich zu bewerben.
InformationsquelleAutor kjhughes
Standardmäßig XSLT nicht für Vorlagen passende Attribut-nodes. Explizit übernehmen von Vorlagen, um alle Attribute in der Eingabe-XML an.
Durch die Art und Weise, sind Sie sicher, dass Sie verwenden möchten
xsl:message
? Der Inhalt einesxsl:message
ist nicht enthalten in der Ausgabe der transformation. Meinst duxsl:value-of
? Auch, wenn Sie die Ausgabe von text, sollten Sie erklären die output-Methode text zu sein.Stylesheet
Text-Ausgabe
Tatsächlich, in diesem sehr einfachen Fall der ersten Vorlage würde ausreichen, um die gleiche Ausgabe:
Dies ist, weil, sobald die Vorlagen angewendet wird, um Attribut-Knoten, gibt es eine built-in template, dass sich die Ausgaben Ihrer string-Wert standardmäßig.
InformationsquelleAutor Mathias Müller
Sich das problem mit dem aktuellen Ansatz ist, dass das template-matching das Attribut/s ist nie angewendet. Es ist nicht angewendet, weil die built-in template-Regel entspricht nur der root-Knoten-und element-Knoten, und es gilt nur Vorlagen für Kinder Knoten. Anwenden einer Vorlage auf Attribute, müssen Sie es ausdrücklich selbst.
http://www.w3.org/TR/xslt20/#built-in-rule
InformationsquelleAutor michael.hor257k