Сложная проблема с использованием xslt с плохо сформированным HTML - PullRequest
1 голос
/ 22 мая 2010

Я довольно новичок в xslt (2.0) и у меня возникли некоторые проблемы с хитрой проблемой. По сути, у меня есть плохо отформатированный HTML-файл, как показано ниже:

    <html>
    <body>

    <p> text 1 </p>
    <div> <p> text 2</p> </div>
    <p> Here is a list
        <ul>
            <ol> 
                <li> ListItem1 </li>
            <li> ListItem1 </li>
        </ol>
        <dl>
            <li> dl item </li>
            <li> dl item2 </li>
        </dl>
    </ul> 
    <div>
    <p> I was here</p>
    </div>
    </p>
</body>
</html>

И я пытаюсь поместить его в красиво отформатированный XML-файл. В моем файле xslt я рекурсивно проверяю, все ли потомки p или div являются другими p или div, и просто рекламирую их, иначе я использую их как отдельные абзацы. Я расширил эту идею так, что если p или div со списком потомков отображаются правильно, но не рекламируют список потомков.

Проблема, с которой я сталкиваюсь, заключается в том, что выводимый мной xml следующий:

    <?xml version="1.0" encoding="utf-8"?><html>
    <body>

    <p> text 1 </p>
     <p> text 2</p> 
     Here is a list
    <ul>
        <ol> 
            <li> ListItem1 </li>
            <li> ListItem1 </li>
        </ol>
        <dl>
            <li> dl item </li>
            <li> dl item2 </li>
        </dl>
    </ul> 

    <p> I was here</p>



</body>
</html>

"Вот список" тоже должен быть в тегах абзаца! Я схожу с ума, пытаясь решить это ... Любой вход / ссылки будут с благодарностью.

1 Ответ

1 голос
/ 22 мая 2010

Это преобразование :

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match=
  "div[descendant::div or descendant::p]
  |
   p[descendant::div or descendant::p]
  ">
   <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match=
  "div[descendant::div or descendant::p]/text()
  |
   p[descendant::div or descendant::p]/text()
  ">
   <xsl:element name="{name(..)}"
        namespace="{namespace-uri(..)}">
     <xsl:copy-of select="."/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML дает требуемый, правильный вывод :

<html>
   <body>
      <p> text 1 </p>
      <p> text 2</p>
      <p> Here is a list

      </p>
      <ul>
         <ol>
            <li> ListItem1 </li>
            <li> ListItem1 </li>
         </ol>
         <dl>
            <li> dl item </li>
            <li> dl item2 </li>
         </dl>
      </ul>
      <p> I was here</p>
   </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...