2008-11-07 11 views
10

Próbuję przekonwertować niektóre Xaml na HTML za pomocą .NET XslCompiledTransform i mam trudności z uzyskaniem xslt w celu dopasowania tagów Xaml. Na przykład z tego wejścia Xaml:xsl: dopasowanie do szablonu nie znajduje dopasowań

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

i to 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> 

uzyskać ten wynik:

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

Zamiast oczekiwanego:

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

Could to może być problem z przestrzenią nazw? Jest to moja pierwsza próba transformacji xsl, więc nie mogę się doczekać.

Odpowiedz

20

Tak, jest to problem z przestrzenią nazw. Wszystkie elementy w dokumencie wejściowym znajdują się w przestrzeni nazw http://schemas.microsoft.com/winfx/2006/xaml/presentation. Twój szablon próbuje dopasować elementy, które znajdują się w domyślnym obszarze nazw, i nie znajduje żadnych.

Musisz zadeklarować tę przestrzeń nazw w transformacji, przypisać jej prefiks, a następnie użyć tego przedrostka w dowolnych wzorach, które mają dopasować elementy w tym obszarze nazw. Więc XSLT powinien wyglądać mniej więcej tak:

<?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

Dzięki Robert - Próbowałem dodać obszar nazw do znacznika xsl: stylesheet, ale nie dodałem przestrzeni nazw do pola dopasowania. – dmo

0

To działa, kiedy to usunąć z dokumentu źródłowego:

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

Nie wierzę w twoje ostatnie dwa szablony są dopasowane w ogóle. (Można przetestować umieszczając coś jak owijanie <div> w szablonie FlowDocument.)

+0

FlowDocument pochodzi bezpośrednio z RichTextBox WPF, więc wolałbym obsłużyć go w xslt niż manipulując źródłem. Dodanie przestrzeni nazw i zakwalifikowanie pól dopasowania elementu rozwiązało problem. – dmo

0

Wystarczy spróbować zmienić

"xsl: template match = '/'"

tag w pliku xsl z

"xsl: template match = '*'"

To powinno dać pożądany wynik.

Powiązane problemy