2008-11-07 2 views
10

Я пытаюсь преобразовать некоторые Xaml в HTML с помощью .NET XslCompiledTransform, и я столкнулся с трудностями при получении xslt в соответствии с тегами Xaml. Например, с этой Xaml ввода:xsl: соответствие шаблону не найдено

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

И этот 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> 

я получаю этот выход:

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

Вместо ожидаемого:

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

Могли это проблема с пространством имен? Это моя первая попытка преобразования xsl, поэтому я в недоумении.

ответ

20

Да, это проблема с пространством имен. Все элементы вашего входного документа находятся в пространстве имен http://schemas.microsoft.com/winfx/2006/xaml/presentation. Ваш шаблон пытается сопоставить элементы, которые находятся в пространстве имен по умолчанию, и он не находит каких-либо.

Вам нужно объявить это пространство имен в своем преобразовании, назначить ему префикс, а затем использовать этот префикс в любых шаблонах, которые предназначены для соответствия элементам в этом пространстве имен. Так что ваш 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" 
    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

Спасибо, Роберт. Я попытался добавить пространство имен в тег xsl: stylesheet, но не добавил пространство имён в поле соответствия. – dmo 2008-11-07 19:20:46

0

Это работает, когда я удалить это из исходного документа:

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

Я не верю, что ваши последние два шаблона согласования на всех. (Вы можете проверить, поставив что-то вроде упаковки <DIV> в шаблоне FlowDocument.)

+0

FlowDocument поставляется непосредственно из WPF RichTextBox, поэтому я бы лучше обработал его в xslt, чем манипулируя источником. Исправлена ​​проблема с добавлением пространства имен и квалификацией полей соответствия элементов. – dmo 2008-11-07 19:30:03

0

Просто попробуйте изменить

"XSL: матч шаблон = '/'"

тег в файле XSL с

"XSL: шаблон матч = '*'"

Это должно дать вам желаемый результат.

Смежные вопросы