вставьте теги HTML в обычный текст, используя XSLT - PullRequest
0 голосов
/ 07 марта 2020

Мой ввод выглядит следующим образом

<Report>
Report Title\.br\\.br\SECTION1\.br\\.br\****Plain Text*****\.br\\.br\SECTION2\.br\\.br\******Plain Text*****\.br\\.br\*****Plain Text*****
</Report>

Я хотел бы добавить теги html ниже, используя XSLT, и мой вывод выглядит следующим образом

<Report> 
<html> <head>  </head> <body> <p> <b><u>Report Title</u></b> </p> <p align="left"> </p> <p align="left"> <b>SECTION1</b> </p> <p align="left"> *****Plain Text***** </p> <p align="left"> </p> <p align="left"> <b>SECTION2</b> </p> <p align="left"> *****Plain Text***** </p> <p align="left"> </p> <p align="left"> *****Plain Text******<b> </b> </p> </body> </html>
</Report>

любые мысли о том, как чтобы достичь этого?

Я начал с создания следующих переменных для токенизации тела моего отчета

<xsl:variable name="ReportText" select="/Report" />

, затем я научился разбивать теги, открывая и закрывая теги.

Opening Report Tags: <html> <head> </head> <body>

Closing Report Tags: </body> </html>

Report Title Opening Tags: <p> <b><u>

Report Title Closing Tags: </u></b> </p> <p align="left> </p>

Section Opening Tags: <p align="left"> <b>

Section Closing Tags: </b> </p>

Text Opening Tags: <p align="left">

Text Closing Tags: </p> <p align="left">

создали следующие переменные, чтобы отразить разбивку

<xsl:variable name="OpeningReportTags" select="'&lt;html&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt;'" />

<xsl:variable name="ClosingReportTags" select="'&lt;/body&gt; &lt;/html&gt;'" />

<xsl:variable name="OpeningTitleTags" select="'&lt;p&gt; &lt;b&gt;&lt;u&gt;'" />

<xsl:variable name="ClosingTitleTags" select="'&lt;/u&gt;&lt;/b&gt; &lt;/p&gt; &lt;p align=&quot;left&quot;&gt; &lt;/p&gt;'" />

<xsl:variable name="OpeningSectionTags" select="'&lt;p align=&quot;left&quot;&gt; &lt;b&gt;'" />

<xsl:variable name="ClosingSectionTags" select="'&lt;/b&gt; &lt;/p&gt;'" />

<xsl:variable name="OpeningTextTags" select="'&lt;p align=&quot;left&quot;&gt;'" />

<xsl:variable name="ClosingTextTags" select="'&lt;/p&gt; &lt;p align=&quot;left&quot;&gt;'" />

В моем примере я выяснил, что существует 11 токенов.

  • Я знаю, что мой первый токен всегда будет заголовком
  • Второй токен всегда будет разделом
  • может быть от 1 до n разделов
  • Между разделами может быть много строк текста, в этом случае токен будет иметь нулевое значение

У меня возникли проблемы, так как количество токенов не установлено c и будет очень сильно меняться в зависимости от входного отчета.

1 Ответ

1 голос
/ 08 марта 2020

Поскольку вы знаете, что первым токеном является заголовок, вы можете сделать:

XSLT 2.0

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <Report> 
        <html>
            <head/>
            <body>
                <xsl:for-each select="tokenize(Report, '\\.br\\\\.br\\')">
                    <p>
                        <xsl:choose>
                            <xsl:when test="position()=1">
                                <b><u><xsl:value-of select="."/></u></b>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:attribute name="align" select="'left'"/>
                                <xsl:value-of select="."/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </p>   
                </xsl:for-each>         
            </body>
        </html>
    </Report>
</xsl:template>

</xsl:stylesheet>

, чтобы получить:

Результат

<?xml version="1.0" encoding="UTF-8"?>
<Report>
   <html>
      <head/>
      <body>
         <p>
            <b>
               <u>
Report Title</u>
            </b>
         </p>
         <p align="left">SECTION1</p>
         <p align="left">****Plain Text*****</p>
         <p align="left">SECTION2</p>
         <p align="left">******Plain Text*****</p>
         <p align="left">*****Plain Text*****
</p>
      </body>
   </html>
</Report>

Я не вижу способа различить guish между разделом и строкой текста (за исключением самого первого раздела) , Если вы знаете, как это сделать, вы можете добавить еще одну xsl:when инструкцию, чтобы сделать разделы жирными:

                            <xsl:when test="????">
                                <b><xsl:value-of select="."/></b>
                            </xsl:when>

Демо : https://xsltfiddle.liberty-development.net/93dFepv

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