2008-11-07 107 views
10

我试图将一些Xaml转换为使用.NET XslCompiledTransform的HTML,并且遇到了使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

Thanks Robert - 我曾尝试将名称空间添加到xsl:stylesheet标记,但未将名称空间添加到匹配字段。 – dmo 2008-11-07 19:20:46

0

它的工作原理,当我从你的源文件删除此:

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

我不相信你的最后两个模板都匹配。 (您可以通过将像在你的FlowDocument模板包裹<DIV>测试。)

+0

FlowDocument直接来自WPF RichTextBox,所以我宁愿在xslt中处理它,而不是通过操作源代码。添加命名空间并限定元素匹配字段修复了问题。 – dmo 2008-11-07 19:30:03

0

刚刚尝试改变

:在您的XSL文件 “XSL模板匹配= '/'”

标签与

“的xsl:模板匹配= '*'”

这应该给你所需的输出。