Создать абзацы с помощью xsl - PullRequest
1 голос
/ 31 марта 2011

Эй, я бродил, есть ли у кого-нибудь предложения о том, как взять новые строки из файла XML и преобразовать их в абзацы с XSL-преобразованием.

Вот как выглядит структура XML:

<?xml version="1.0" encoding="ISO-8859-1"?>

<document>
<book>
<issue>1</issue>
<body>
“Dude, I can't believe you fed it to your cat.  That's crazy!” 

“Yeah, dude, he just cuddled up next to me and started purring.”

“Then what did he do?”

“He just kept purring, man.  He's been purring non-stop for like two weeks now.  I can't even sleep.”  
</body>
</book>
</document>

А вот копия листа XSL, который я использую для преобразования.

<?xml version="1.0" encoding="ISO-8859-1"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    xmlns="http://www.w3.org/1999/xhtml">

<body style="font-family:Arial;font-size:12pt;">

<xsl:for-each select="document/book">

<div style="color:red; padding:4px;">
<span style="font-weight:bold">
</span> Chapter 
<xsl:value-of select="info/issue"/>
</div>
<div style="margin-left:10px; margin-bottom:1em; margin-right:25px; font-size:10pt;">
<span>
<xsl:value-of select="body"/>
</span>
</div>

</xsl:for-each>
</body>
</html>

Опять же, мой вопрос касается того, какие команды использовать для сохранения структуры абзаца с использованием существующего XSL-документа.

Спасибо, E

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

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

<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="body/text()" name="replaceNL">
  <xsl:param name="pText" select="."/>

  <xsl:if test="string-length($pText)">
   <xsl:choose>
    <xsl:when test="not(contains($pText, '&#xA;'))">
      <xsl:value-of select="$pText"/>
    </xsl:when>
    <xsl:otherwise>
     <p>
       <xsl:value-of select=
       "substring-before($pText,'&#xA;')"/>
     </p>
     <xsl:call-template name="replaceNL">
      <xsl:with-param name="pText" select=
       "substring-after($pText,'&#xA;')"/>
     </xsl:call-template>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

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

<document>
<book>
<issue>1</issue>
<body>
“Dude, I can't believe you fed it to your cat.  That's crazy!”

“Yeah, dude, he just cuddled up next to me and started purring.”

“Then what did he do?”  “He just kept purring, man.  He's been purring non-stop for like two weeks now.  I can't even sleep.”
</body>
</book>
</document>

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

<document>
   <book>
      <issue>1</issue>
      <body>
         <p/>
         <p>“Dude, I can't believe you fed it to your cat.  That's crazy!”</p>
         <p>        </p>
         <p>“Yeah, dude, he just cuddled up next to me and started purring.”</p>
         <p>        </p>
         <p>“Then what did he do?”  “He just kept purring, man.  He's been purring non-stop for like two weeks now.  I can't even sleep.”</p>
      </body>
   </book>
</document>

Объяснение : Правило идентификации + рекурсивный именованный шаблон для переноса в p каждой текстовой подстроки, окруженной символами NL.

0 голосов
/ 31 марта 2011

Взгляните на FXSL 1.2, http://sourceforge.net/projects/fxsl/. Я не могу ответить на вопрос о качестве и полезности этого проекта, но, по крайней мере, он содержит много материала, а некоторые могут вам понадобиться.

В противном случае атака будет состоять в том, чтобы выбрать текстовый узел тела и рекурсивно создать новые текстовые узлы, используя функции substring-before и substring-after, и окружая каждый новый текстовый узел узлом "p". Рекурсивный бит, вероятно, самая сложная часть, но в приведенном выше коде есть много примеров.

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