2008-11-07 4 views
10

Je suis en train de convertir du Xaml en HTML en utilisant le .NET XslCompiledTransform et je rencontre des difficultés pour faire en sorte que le xslt corresponde aux balises Xaml. Par exemple, avec cette entrée Xaml:xsl: la correspondance de modèle ne trouve pas les correspondances

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

Et ce 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> 

Je reçois cette sortie:

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

plutôt que le taux prévu:

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

pourrait c'est un problème avec l'espace de noms? C'est ma première tentative de transformation xsl, donc je suis à court de ressources.

Répondre

20

Oui, c'est un problème avec l'espace de noms. Tous les éléments de votre document d'entrée se trouvent dans l'espace de noms http://schemas.microsoft.com/winfx/2006/xaml/presentation. Votre modèle tente de faire correspondre les éléments qui se trouvent dans l'espace de nom par défaut, mais il n'en trouve aucun.

Vous devez déclarer cet espace de noms dans votre transformation, lui attribuer un préfixe, puis utiliser ce préfixe dans tous les modèles destinés à correspondre à des éléments de cet espace de noms. Ainsi, votre XSLT devrait ressembler à ceci:

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

Merci Robert - J'avais essayé d'ajouter l'espace de noms à la balise xsl: stylesheet mais je n'avais pas ajouté l'espace de noms au champ de correspondance. – dmo

0

Il fonctionne quand je le supprimer de votre document source:

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

Je ne crois pas que vos deux derniers modèles répondent à tous. (Vous pouvez tester en mettant quelque chose comme un emballage <div> dans votre modèle de FlowDocument.)

+0

Le FlowDocument provient directement d'un RichTextBox WPF, donc je préfère le manipuler dans le xslt qu'en manipulant la source. L'ajout de l'espace de nom et la qualification des champs de correspondance d'élément ont résolu le problème. – dmo

0

juste essayer de changer

"xsl: template match = '/'"

tag

dans votre fichier xsl avec

"xsl: template match = '*'"

Cela devrait vous donner la sortie désirée.

Questions connexes