XSLT соответствует узлу, где у дочернего элемента есть атрибут со значением - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь разобрать FlowDocument, в котором есть несколько конкретных случаев совпадения шаблонов, с которыми у меня возникают проблемы.

Итак, для документа Xaml ниже (он был создан открытием Word, созданием текста, затем копированием в WPT richtextbox и извлечением FlowDocument Xaml).

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Span xml:lang="en-us">
  <Span.TextDecorations>
    <TextDecoration Location="Underline" />
  </Span.TextDecorations>
  List Item 2
</Span>
<Run>
  <Run.TextDecorations>
    <TextDecoration Location="Underline" />
  </Run.TextDecorations>
  List Item 3
</Run>
</FlowDocument>

Используя следующий Xslt, я пытаюсь сопоставить теги Span и Run, которые имеют дочерний узел "TextDecoration" со значением атрибута "Location = Underline".

<?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:Run/Run.TextDecorations/TextDecoration[@Location='Underline']">
    <u>
      <xsl:apply-templates />
    </u>
  </xsl:template>
</xsl:stylesheet>

Я понимаю, что приведенный выше оператор не будет работать, и если бы он действительно это сделал, он, вероятно, выбрал бы дочерний узел, а не родительский узел, к которому я стремлюсь.

Вывод, который я пытаюсь получить, следующий:

<html xmlns:p="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<body>
<u>List Item 2</u>
<u>List Item 3</u>
</body>
</html>

У меня также возникают проблемы с совпадением элемента "p: Run / Run.TextDecorations". Используя Visual Studio и пошагово выполняя выполнение, он никогда не находит узел, который я пытаюсь найти.

Любые советы приветствуются! Спасибо!

1 Ответ

0 голосов
/ 03 февраля 2012

Есть несколько способов сопоставить их.Например, вы можете указать полный путь к узлу-потомку, который вы хотите проверить на

<xsl:template 
   match="p:Run[p:Run.TextDecorations/p:TextDecoration/@Location='Underline']">

Или, если вы хотите быть менее явным, и просто проверить, есть ли соответствие потомков на каком-то уровне, вы можете сделатьследующие

<xsl:template 
    match="p:Span[descendant::p:TextDecoration/@Location='Underline']">

Обратите внимание на использование префикса пространства имен для всех элементов в условии XPath.

Итак, учитывая следующее XSLT

<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 p">
   <xsl:output method="html" indent="yes"/>
   <xsl:template match="/">
      <html>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>
   <xsl:template match="p:Run[p:Run.TextDecorations/p:TextDecoration/@Location='Underline']">
      <u>
         <xsl:apply-templates/>
      </u>
   </xsl:template>
   <xsl:template match="p:Span[descendant::p:TextDecoration/@Location='Underline']">
      <u>
         <xsl:apply-templates/>
      </u>
   </xsl:template>
   <xsl:template match="p:FlowDocument">
      <xsl:apply-templates/>
   </xsl:template>
</xsl:stylesheet>

Применительно кваш пример XML, выводится следующее:

<html>
   <body>
      <u> List Item 2 </u>
      <u> List Item 3 </u>
   </body>
</html>
...