xsl: совпадение шаблона не находит совпадений - PullRequest
10 голосов
/ 07 ноября 2008

Я пытаюсь преобразовать некоторые 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, поэтому я в растерянности.

Ответы [ 3 ]

20 голосов
/ 07 ноября 2008

Да, это проблема с пространством имен. Все элементы во входном документе находятся в пространстве имен 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 голосов
/ 08 июня 2010

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

"xsl: template match = '/'"

тег в вашем xsl файле с

"xsl: template match = '*'"

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

0 голосов
/ 07 ноября 2008

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

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

Я не верю, что ваши последние два шаблона вообще совпадают. (Вы можете проверить, поместив что-то вроде обтекания

в шаблон FlowDocument.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...