Манипулирующая строка внутри XML узла - PullRequest
0 голосов
/ 09 марта 2020

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

будут выглядеть примерно так this

John|Doe|23|19970101||||
123456|State Farm|Insured
claim|Report Title\.br\\.br\SECTION_TITLE\.br\\.br\****Plain 
Text*****\.br\\.br\SECTION_TITLE\.br\\.br\******Plain Text*****\.br\\.br\*****Plain Text*****|

Внутренне это будет преобразовано в документ xml следующим образом

<message>
<person>
<firstname>John</firstname>
<lastname>Doe</lastname>
<dateOfBirth>19970101</dateOfBirth>
<x/>
<y/>
<z/>
</person>
<Insurance>
<PolicyNumber>123456</PolicyNumber>
<InsurerName>State Farm</InsurerName>
<x/>
<y/>
</Insurance>
<Documents>
<Type>claim</Type>
<Report>Report Title\.br\\.br\SECTION_TITLE\.br\\.br\****Plain 
Text*****\.br\\.br\SECTION_TITLE\.br\\.br\******Plain Text*****\.br\\.br\*****Plain Text*****</Report>
</Documents>
</message>

Принимающая система ожидает, что строка отчета в узле <Report> будет отформатирована с тегами html. Ниже приведено полное сообщение с узлом <Report>, отформатированным с тегами html

<message>
<person>
<firstname>John</firstname>
<lastname>Doe</lastname>
<dateOfBirth>19970101</dateOfBirth>
<x/>
<y/>
<z/>
</person>
<Insurance>
<PolicyNumber>123456</PolicyNumber>
<InsurerName>State Farm</InsurerName>
<x/>
<y/>
</Insurance>
<Documents>
<Type>claim</Type>
<Report>&lt;html&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt;&lt;p&gt; &lt;b&gt;&lt;u&gt;Report Title&lt;/u&gt;&lt;/b&gt; &lt;/p&gt; &lt;p align=&quot;left&quot;&gt; &lt;/p&gt;&lt;p align=&quot;left&quot;&gt; &lt;b&gt;SECTION_TITLE&lt;/b&gt; &lt;/p&gt;&lt;p align=&quot;left&quot;&gt;****Plain 
Text*****&lt;/p&gt; &lt;p align=&quot;left&quot;&gt;&lt;p align=&quot;left&quot;&gt; &lt;b&gt;SECTION_TITLE&lt;/b&gt; &lt;/p&gt;&lt;p align=&quot;left&quot;&gt;******Plain Text*****&lt;/p&gt; &lt;p align=&quot;left&quot;&gt;&lt;p align=&quot;left&quot;&gt;*****Plain Text*****&lt;/p&gt; &lt;p align=&quot;left&quot;&gt;&lt;/body&gt; &lt;/html&gt;</Report>
</Documents>
</message>

Преобразованный документ XML будет преобразован в следующем порядке и отправит ожидаемый результат на принимающая система на исходящем.

John|Doe|23|19970101||||
123456|State Farm|Insured
claim|<html> <head>  </head> <body> <p> <b><u>Report Title</u></b> </p> <p align="left"> </p> <p align="left"> <b>SECTION_TITLE</b> </p> <p align="left"> *****Plain Text***** </p> <p align="left"> </p> <p align="left"> <b>SECTION_TITLE</b> </p> <p align="left"> *****Plain Text***** </p> <p align="left"> </p> <p align="left"> *****Plain Text******<b> </b> </p> </body> </html>|

Использование XSLT. Если я токенизирую с шаблоном '\ .br \\. br \', предполагая, что первый токен всегда - заголовок отчета, а SECTION_TITLE - ключевые слова, которые я могу ищите, используя функцию содержащую .... как мне тогда построить строку узла и получить желаемый результат? или есть лучший способ добиться того же результата?

1 Ответ

0 голосов
/ 09 марта 2020

Принимая ваш XML в качестве ввода и требуемый XML результат с помощью экранированной разметки HTML в качестве результата, вы можете использовать XSLT 3 и функцию serialize для сериализации результата, полученного из шага, подобного шагу в ответе на свой предыдущий вопрос:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="Report">
      <xsl:copy>
          <xsl:variable name="html-doc">
            <html>
                <head/>
                <body>
                    <xsl:for-each select="tokenize(., '\\.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>              
          </xsl:variable>
          <xsl:value-of select="serialize($html-doc, map { 'method' : 'html', 'indent' : false(), 'include-content-type' : false() })"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/ehVZvvz или https://xsltfiddle.liberty-development.net/ehVZvvz/1, где я использовал раздел CDATA, чтобы прочитать результат сериализации подробнее легко показать результат, который дает процессор XSLT 3, например, Saxon 9.8 или новее.

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