2012-04-11 17 views
1

Ich benutze php DOMDocument für XSLT eine XML in einer anderen verwandeln und ich brauche zusätzlichen Tag zu verwenden - mytag in resultierenden Dokument-Tag wieDefinieren von benutzerdefinierten Tags in XSLT-Transformation

<mytag:full-text>...</mytag:full-text> 

diesen Tag zu definieren i Bau tryed wie folgt aus:

<xsl:namespace-alias stylesheet-prefix="mytag" result-prefix="mytag"/> 

und so bekomme ich einen Fehler

Warning: DOMDocument::load() [domdocument.load]: Namespace prefix mytag on full-text is not defined 

was mache ich falsch?

+0

Sie scheinen „Tag“ zu verwenden bedeutet sowohl „Namespacepräfix“ und „Element“. Ersteres ist besonders nicht genau. Ich denke, Sie werden Ihre Arbeit viel einfacher für sich selbst machen und mit anderen kommunizieren, wenn Sie eine grundlegende XML-Terminologie lernen. Z.B. siehe http://www.cafeconleche.org/books/effectivexml/chapters/00.html – LarsH

Antwort

2

Hier bekommen ist ein komplettes Codebeispiel, wie dies zu tun:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:mytag="my:tag" exclude-result-prefixes="mytag"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="b"> 
    <b> 
    <mytag:full-text>Some full-text here</mytag:full-text> 
    </b> 
</xsl:template> 
</xsl:stylesheet> 

Wenn diese Umwandlung auf das folgende XML-Dokument angewendet wird:

<a><b/></a> 

das gewünschte, korrekte Ergebnis (das neue Element unter b hinzugefügt) hergestellt wird:

<a> 
    <b> 
     <mytag:full-text xmlns:mytag="my:tag">Some full-text here</mytag:full-text> 
    </b> 
</a> 
+0

dies: exclude-result-prefixes = "mytag" hat gut funktioniert! – shershen

+0

@shershen: Gern geschehen. –

1

Versuchen Hinzufügen xmlns: mytag = "some_namespace" an der Wurzel Ihrer XSLT, so dass Sie so etwas wie dieses

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:mytag="some_namespace"> 
+0

Dieser Fehler ist verschwunden, aber jetzt bekomme ich das Attribut xmlns: mytag = "http: // ..." auf jedem root-Tag in resulting XML-Dokument – shershen

+0

Das ist das erwartete Verhalten. Damit Ihre Ausgabe als XML gültig ist, muss das Namespace-Präfix für 'Mytag' irgendwo in Ihrem XML-Dokument angegeben werden, andernfalls hat 'Mytag' keine Bedeutung. Sie können sie manuell zum Stammknoten Ihrer Ausgabe hinzufügen, wenn Sie nicht möchten, dass sie allen untergeordneten Knoten hinzugefügt wird. –

+0

@shershen: Ich weiß nicht, was Sie mit "Root-Tag" meinen - möglicherweise die Start-Tag des äußersten Elements? Je nachdem, was Sie meinen, könnten Sie 'exclude-result-prefixes =" * "' auf dem Element 'xsl: stylesheet' verwenden. Eine weitere Frage ist, warum Sie xmlns: mytag-Deklarationen für bestimmte Elemente vermeiden möchten. Es sollte nichts schaden und einige Deklarationen sind notwendig, wenn Sie Namespaces verwenden. Wenn Sie Namespace-Deklarationen haben, von denen Sie denken, dass sie unnötig sind und nicht durch "exclude-result-prefixes" gelöst werden, geben Sie bitte Details an. – LarsH

Verwandte Themen