2008-11-07 6 views
10

Ich versuche, einige Xaml in HTML mit der .NET XslCompiledTransform zu konvertieren und läuft in Schwierigkeiten, die Xslt mit Xaml-Tags übereinstimmen. Zum Beispiel mit diesem XAML-Eingang:xsl: Vorlage Übereinstimmung findet keine Übereinstimmungen

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <Paragraph>a</Paragraph> 
</FlowDocument> 

Und dieses Xslt:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 

    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:apply-templates /> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="FlowDocument"> 
    <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Paragraph" > 
    <p> 
     <xsl:apply-templates /> 
    </p> 
    </xsl:template> 

bekomme ich diese Ausgabe:

<html> 
    <body> 
    a 
</body> 
</html> 

Statt der erwarteten:

<html> 
    <body> 
     <p>a</p> 
    </body> 
</html> 

Could Dies ist ein Problem mit dem Namespace? Dies ist mein erster Versuch einer xsl-Transformation, also bin ich ratlos.

Antwort

20

Ja, es ist ein Problem mit dem Namespace. Alle Elemente in Ihrem Eingabedokument befinden sich im Namespace http://schemas.microsoft.com/winfx/2006/xaml/presentation. Ihre Vorlage versucht, Elemente im Standardnamespace abzugleichen, und findet keine.

Sie müssen diesen Namespace in Ihrer Transformation deklarieren, ihm ein Präfix zuweisen und dieses Präfix dann in allen Mustern verwenden, die Elemente in diesem Namespace zuordnen sollen. So sollte Ihr XSLT etwas wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:p="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    exclude-result-prefixes="msxsl"/> 

<xsl:output method="html" indent="yes"/> 

<xsl:template match="/"> 
    <html> 
    <body> 
     <xsl:apply-templates /> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="p:FlowDocument"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="p:Paragraph" > 
    <p> 
    <xsl:apply-templates /> 
    </p> 
</xsl:template> 
+0

Vielen Dank Robert - Ich hatte versucht, den Namespace zum xsl: stylesheet-Tag hinzuzufügen, aber den Namespace nicht dem Match-Feld vorangestellt. – dmo

0

Es funktioniert, wenn ich dies aus Ihrem Quelldokument zu entfernen:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 

Ich glaube nicht, dass Ihre letzten zwei Vorlagen überhaupt passen. (Können Sie testen, indem Sie so etwas wie eine Verpackung <div> in Ihrer Flowdocument Vorlage setzen.)

+0

Das FlowDocument kommt direkt von einer WPF RichTextBox, also würde ich es lieber im xslt behandeln als durch Manipulation der Quelle. Durch Hinzufügen des Namespaces und Qualifizieren der Elementübereinstimmungsfelder wurde das Problem behoben. – dmo

0

Versuchen Sie einfach zu ändern

"xsl: template match = '/'"

Tag in Ihrer XSL-Datei mit

"xsl: template match = '*'"

Dies sollten Sie die gewünschte Ausgabe geben.