XHTML. Вложите <div>текст в абзацы и преобразуйте <br/> в абзацы с XSLT 1.0 - PullRequest
5 голосов
/ 09 августа 2011

Я ищу быстрый и простой способ конвертировать его XML (который похож на XHTML) с помощью XSLT 1.0:

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <head/>
  <body>
    <div>Hello<a href="http://google.com">this is the first</a>line.<p>This the second.<br/>And this the third one.</p></div>
  </body>
 </html>

в этот:

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <head/>
  <body>
    <div>
        <p>Hello<a href="http://google.com">this is the first</a>line.</p>
        <p>This the second.</p>
        <p>And this the third one.</p>
    </div>
  </body>
 </html>

Iдумал об алгоритме обхода дерева в XSLT 1.0.Что сложно, например, вложенные <a> ссылки.А также существующие <p> не должны быть удалены.

Может кто-нибудь помочь мне с этим?Большое спасибо.

1 Ответ

5 голосов
/ 09 августа 2011

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

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" 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[text() and p]">
  <div>
   <p>
     <xsl:apply-templates select="node()[not(self::p or preceding-sibling::p)]"/>
   </p>
   <xsl:apply-templates select="p | p/following-sibling::node()"/>
  </div>
 </xsl:template>

 <xsl:template match="p[text() and br]">
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match=
  "p/text()
    [preceding-sibling::node()[1][self::br]
    or
     following-sibling::node()[1][self::br]
    ]">
  <p><xsl:value-of select="."/></p>
 </xsl:template>

 <xsl:template match="p/br"/>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<html>
    <head/>
    <body>
        <div>Hello
            <a href="http://google.com">this is the first</a>line.
            <p>This the second.<br/>And this the third one.</p>
        </div>
    </body>
</html>

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

<html>
   <head/>
   <body>
      <div>
         <p>Hello
            <a href="http://google.com">this is the first</a>line.
            </p>
         <p>This the second.</p>
         <p>And this the third one.</p>
      </div>
   </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...