Xsl: соответствие шаблону не найдено
Я пытаюсь преобразовать некоторые Xaml в HTML, используя .NET XslCompiledTransform, и я сталкиваюсь с трудностями при получении xslt в соответствии с тегами Xaml. Например, с помощью этого ввода Xaml:
<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, поэтому я не понимаю.
Ответы
Ответ 1
Да, это проблема с пространством имен. Все элементы входного документа находятся в пространстве имен 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>
Ответ 2
Он работает, когда я удаляю это из исходного документа:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Я не считаю, что ваши последние два шаблона совпадают. (Вы можете протестировать, помещая что-то вроде wrapping <div> в ваш шаблон FlowDocument.)
Ответ 3
Просто попробуйте изменить
"xsl: template match = '/'"
в вашем xsl файле с помощью
"xsl: template match = '*'"
Это даст вам желаемый результат.