2009-02-03 6 views
7

Ich habe eine XSLT erstellt, um ein bestimmtes XML-Dokument zu behandeln. In einigen, aber nicht allen unseren Dokumenten werden jetzt Namespaces eingeführt. Ich würde gerne das gleiche XSLT für diese Dokumente verwenden, aber ich habe Probleme, mein Stylesheet so zu ändern, dass es namespace-unabhängig ist.Ändern einer XSLT als Namespace agnostisch

Es wurde bereits vorgeschlagen, meine xpaths zu *[local-name()="ElementName"] zu ändern, aber wenn wir bereits ein Stylesheet gemacht haben, ist dies sehr arbeitsintensiv.

Darüber hinaus bin ich mir bewusst, dass ich den xpath-default-namespace auf den bestimmten Namespace festlegen kann, aber wie bereits erwähnt, kann ich nicht einfach auf alle oder eine Liste möglicher Namespaces festlegen. Ich suche nach einer effektiveren Lösung und stelle mir die Erweiterungsfunktionen des Saxon-Prozessors zur Verfügung. Irgendwelche Ideen? Vielen Dank.

Antwort

3

Haben Sie Vorverarbeitung betrachtet Ihre XML-Dokumente?

Sie können alle Namespaces entfernen (beachten Sie mögliche Konflikte) und sie dann mit der vorhandenen XSL-Transformation verarbeiten.

Ein solcher Ansatz hätte den Vorteil, dass Sie Ihr XSLT überhaupt nicht modifizieren müssen. Es bleibt lesbar (der * [local-name() = 'frob'] sieht so schrecklich aus) und wartbar.

+0

Dies ist, was wir getan haben, um das Namespace-Problem vorübergehend zu mildern. Ich stimme zu, dass das * [local-name() Zeug nicht sehr elegant ist. Danke für die Hilfe! –

1

Nach weiteren Beratungen scheint es keinen einfachen Ausweg zu geben. Die XSLT muss neu entworfen werden, um Namespace-unabhängig zu sein, oder das xpath-default-namespace-Attribut für das Element <xsl:stylesheet> verwenden. Wenn wir den Namensraum des eingehenden Dokuments beibehalten möchten, aber immer noch ein Sheet Arbeit mit mehreren Namespaces dann würde unsere Vorlagen benötigen Sie das folgende Formular ähneln:

<xsl:template match="*[local-name(.)='ElementName']"> 
    <xsl:element name="{local-name(.)}" xmlns="http://yourURIhere"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template/> 

usw.

1

Vielleicht verstehe ich Ihr Problem nicht, aber könnten Sie nicht einfach Ihre Vorlage (n) sowohl die Null-Namespace-Version und die Namespace-Version des Elements? - So:

<xsl:template match="ElementName | NS:ElementName" xmlns:NS="your-namespace"> 
    ... output ... 
</xsl:template> 

(Typischerweise ist die Erklärung des NS-Präfixes würde auf dem Sheet Elemente platziert werden)

Dies ist bei weitem der ‚saubere‘ Version zu mir - ich habe mit diesem beeen ein einziges XSLT-Stylesheet verwenden, um alle drei RSS-Formate zu verarbeiten (0.91, 1.0 & 2.0).

+0

Dies ist eine gute Lösung, obwohl es immer noch das Umschreiben der komplexen Vorlage erfordert. Danke für die Hilfe! –

+0

Das Problem ist die Ausgabe mit dem Namespace, der zuvor vorhanden war – akostadinov

Verwandte Themen