Wie kann ich dynamisch festlegen der Standard-namespace-Deklaration für eine XSLT-transformation der XML-Ausgabe?
Kann ich es tun, aber nicht für den default namespace, mit der <xsl:namespace>.
Wenn ich versuche es zu tun für den default namespace:
<xsl:namespace name="" select"myUri"/>
nie funktioniert. Es verlangt, dass ich explizit definieren den namespace für das element in der Lage sein, um die oben genannten null-Präfix-Deklaration.
Der Grund, warum ich wollen, das ist, weil ich habe eine Aufgabe zum transformieren eines XML-input-Datei in eine andere xml-Ausgabe. Die XML-Ausgabe hat viele Elemente und ich wollen nicht zu haben, der explizit den Namensraum für jedes element. Das ist, warum ich möchte, um den Standard und nie die Mühe wieder. Aber der Standard muss berechnet werden einige Daten in der XML-Quelle. Es ändert sich nicht während der ganzen transformation, aber es ist abhängig von XML-input-Daten.
Jede Lösung?
EDIT 1:
Zu sup-bis:
- Ich möchte einen namespace erstellen, dynamisch und legen Sie es auf der Standard-namespace des xml-Dokuments. Die uri des namespace abgeleitet ist von einigen Daten in der XML-Eingabedatei.
- Wenn ich
<xsl:namespace>
in mein root-Ausgabe-element, ich kann nicht erstellt ein Standard-namespace für die es nur ein Präfix ein. Und auch mit dem Präfix, ist es nicht weitergegeben an die Kinder.
EDIT 2:
dkackman vorgeschlagen:
<xsl:template match="root">
<xsl:param name ="ns">my-computed-namespace</xsl:param>
<xsl:element name="newRoot" namespace="{$ns}"/>
</xsl:template>
Es fast löst das problem. Leider sind die Kinder eingespritzt wird, mit ""(leer) - namespace durch den Transformator. Hier ist, was ich bekomme, wenn ich ein child-element:
<newRoot xmlns="my-computed-namespace">
<child xmlns=""> ...
</child>
</newRoot>
Warum funktioniert der Transformator setzen diese xmlns=""
in die Kinder? Wenn ich verhindern kann, das dann, das ich gefunden habe, meine Lösung.
- Sie können in der Lage sein, zur Vereinfachung der Aufruf und die übergabe der berechneten namespace an, indem Sie eine variable auf Dokument-Rahmen anstelle des param - ich habe meine Antwort aktualisiert
- Ja, ich weiß, diese Lösung, das ist, was ich ll wahrscheinlich tun. Ich habe dir einen Kommentar auf dieser
- Ich habe nun bestätigt, dass
<xsl:namespace>
ist nicht hilfreich für die Lösung Ihres Problems. Siehe das update meiner Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zusätzlich zu @Tomalak, sofern die genaue Antwort, tun, beachten Sie, dass
<xsl:namespace>
ist nicht beabsichtigt, zu erstellen Sie eine namespace-Deklaration verwendet werden, die von der XSLT-Prozessor in der Regel mit allen Elementen oder Attributen.Zweck der
<xsl:namespace>
ist die Schaffung eines spezifischen namespace-Knoten. Dieser Knoten hat einen begrenzten Rahmen nur: das aktuelle element oder Attribut, und alle Kinder des aktuellen Knotens, wenn Sie nicht re-ordnen Sie die Kennziffer für einen anderen Namensraum-uri.Mit
<xsl:namespace>
ist nur notwendig, wenn wir wollen, erstellen Sie einen namespace dynamisch für einen namespace-uri, die dynamisch generiert werden müssen (war nicht bekannt, statisch zu Beginn der transformation). Solche Fälle sind extrem selten.In allen Fällen, wenn die gewünschte namspace-uri bekannt ist statisch, einfach zu erklären, in diesem namespace auf einem passenden Niveau der Sichtbarkeit (in der Regel am
<xsl:stylesheet>
Anleitung) und dann einfach mit dem dazugehörigen Präfix, überall in diesem namespace verwendet werden muss.UPDATE:
Ich habe nur bestätigt, die im dialog mit Spezialisten in einem anderen forum, dies ist nicht möglich, mit
<xsl:namespace>
. Es fügt eine namespace-Knoten mit keinen Namen für das aktuelle element, aber literal result elements sind 1:1 übernommen und bleiben in Ihrer (nicht) - namespace.Hier ist, wie Dr. Michael Kay, der Editor des W3C WG auf XSLT, erklärt dieser:
", Die Sie zum erstellen von Elementen und Attributen mit der richtigen erweiterten Namen an
die Zeit, die Sie erstellen. Wenn das bedeutet, dass mit
xsl:element
es so sein.xsl:namespace
können nur verwendet werden, um zusätzliche namespace-Knoten, um dieseautomatisch erzeugte für die Präfixe/- uris verwendet, die in element-und
Attribut-Namen; es kann nicht verwendet werden, ändern Sie den Namen eines Elements oder
Attribut-Knoten.
Wie immer dies zu verstehen, müssen Sie verstehen die Daten-Modell für
namespaces. Ein element/Attribut name ist ein Dreibettzimmer, mit
(prefix, uri,
. Ein namespace-Knoten ist ein paarlocalname)
(prefix, uri)
. Es ist eine Konsistenzdie Regel, dass wenn ein element oder Attribut name vorhanden ist, mit
prefix=P
uri=U
dann muss es eine namespace-Knoten
(P, U)
. Die namespace-Korrektur-Prozessstellt sicher, dass der namespace-Knoten wird automatisch erstellt, wenn Sie erstellen eine
element oder Attribut.
xsl:namespace
ist es, Ihnen zu erlauben, zu schaffenzusätzliche namespace-Knoten, in der Regel für die verwendeten namespaces in QName-geschätzt
Inhalt".
Wenn solches Ergebnis erforderlich ist, ist die Lösung mit einem zweiten pass und konvertieren jedes element die Zugehörigkeit zu "kein namespace" auf die gewünschte neue namespace.
Dies ist die transformation zu verwenden, im zweiten Durchgang (die zwei Pässe, die kombiniert werden können in einem einzigen stylesheet/transformation):
, Wenn die oben beschriebene transformation wird angewendet, auf das folgende Beispiel (pass-1-Ergebnis) xml-Dokument:
Das gewünschte Ergebnis produziert wird:
Einfach:
Versuchen Sie dies:
Dann können Sie anrufen, dass wie so:
BEARBEITEN
Oder mit einem
variable
statt einerparam
:(keine Notwendigkeit zum aufrufen von Vorlagen
with-param
)