2008-11-07 8 views
10

Estoy tratando de convertir algo de Xaml a HTML utilizando .NET XslCompiledTransform y estoy teniendo dificultades para conseguir que la xslt coincida con las etiquetas Xaml. Por ejemplo, con esta entrada Xaml:xsl: la coincidencia de la plantilla no encuentra coincidencias

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

Y esto 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> 

consigo esta salida:

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

En lugar de la esperada:

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

Podría esto es un problema con el espacio de nombres? Este es mi primer intento de una transformación xsl, por lo que estoy perdido.

Respuesta

20

Sí, es un problema con el espacio de nombres. Todos los elementos en su documento de entrada están en el espacio de nombres http://schemas.microsoft.com/winfx/2006/xaml/presentation. Su plantilla intenta hacer coincidir los elementos que están en el espacio de nombres predeterminado, y no encuentra ninguno.

Debe declarar este espacio de nombres en su transformación, asígnele un prefijo y, a continuación, use ese prefijo en cualquier patrón que esté destinado a hacer coincidir los elementos en ese espacio de nombres. Por lo que su XSLT debería ser algo como esto:

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

Gracias Robert - He intentado agregar el espacio de nombres a la etiqueta xsl: stylesheet, pero no había antepuesto el espacio de nombres al campo de coincidencia. – dmo

0

Funciona cuando quito esto de su documento de origen:

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

No creo que sus últimas dos plantillas son coincidentes en absoluto. (Se puede probar poniendo algo así como una envoltura <div> en su plantilla FlowDocument.)

+0

El FlowDocument viene directamente de un WPF RichTextBox, así que preferiría manejarlo en el xslt que manipulando el código fuente. Agregar el espacio de nombres y calificar los campos de coincidencia de elementos corrigió el problema. – dmo

0

Sólo trate de cambiar

"xsl: template match = '/'"

etiqueta en su archivo XSL con

"xsl: template match = '*'"

Esto debe darle la salida deseada.

Cuestiones relacionadas