Die Frage ist, wie folgt, ich habe eine einfache XML-Datei:Überschreibungs Xmlns bricht Xslt Ergebnis
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>
Does not work
</td>
</tr>
</table>
Und eine XSL tranformation Datei
<xsl:transform version="1.0" xmlns="http://www.w3.org/TR/html4/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="td">
It works
</xsl:template>
</xsl:transform>
Wenn "td" wird angepasst erwarte ich, um zu sehen "Es funktioniert" als Ausgabe wie in der Vorlage definiert. Wenn "td" nicht übereinstimmt, dann erwarte ich "Does not work", da die Standardvorlagen alle Knotenwerte ausgeben, die nicht von einer benutzerdefinierten Vorlage verarbeitet werden. Ergebnis:
<?xml version="1.0"?>
Does not work
Allerdings, wenn ich die Namespace-Deklarationen zu Xmlns ändern: html = "...", dann ändert sich das Ergebnis.
xml:
<html:table xmlns:html="http://www.w3.org/TR/html4/">
<html:tr>
<html:td>
Does not work
</html:td>
</html:tr>
</html:table>
Xslt:
<xsl:transform version="1.0" xmlns:html="http://www.w3.org/TR/html4/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="html:td">
It works
</xsl:template>
</xsl:transform>
Ergebnis:
<?xml version="1.0"?>
It works
Dies ist ein einfaches Beispiel, das Problem zu isolieren, die XML für die reale Anwendung wird zur Verfügung gestellt von Software von Drittanbietern, Xmlns-Deklaration zu Xmlns überschreiben: ist keine Option. Meine Frage ist, wie bekomme ich dies zur Arbeit, Ergebnis: "Es funktioniert", ohne xmlns zu ändern.
Für die Konvertierung verwende ich Notepad ++ mit XML-Tools-Plugin, wo es eine XSL-Transformation-Option gibt.
Vielen Dank im Voraus
Das löst das Problem, aber ich verstehe immer noch nicht, warum nicht das Voranstellen funktioniert nicht. Wenn kein Präfix vorhanden ist, wird der Namespace, der von xmlns deklariert wird, nicht standardmäßig verwendet, da es keinen Konflikt mit einem anderen Namespace gibt, von dem ich erwartet habe, dass dies funktioniert. – DemanB
@DemanB "* Wenn es kein Präfix gibt, ist es kein Standard für den Namespace, der von xmlns deklariert wird." Wenn es kein Präfix gibt, wird es Elemente in keinem Namespace auswählen. –
@DemanB Bitte lassen Sie mich versuchen, dies noch einmal zu erklären: Ihre Annahme ist, dass in 'xsl: template' -Elementen ein im' xsl: transform'-Element deklarierter Standard-Namespace auf den Wert des 'select'-Attributs angewendet wird. Standard-Namespaces werden jedoch immer nur auf XML-Elemente angewendet, niemals auf Attribute und niemals auf die Werte von Attributen. Es gibt Funktionalität, die dies tut, obwohl ich es in diesem Fall nicht empfehle: ['xpath-default-namespace'] (https://www.ibm.com/developerworks/library/x-xsltmistakes/#list4). Außerdem benötigt es XSLT 2.0. –