амперсандные сущности в длинных строках делают шаблон неисправным - PullRequest
0 голосов
/ 26 апреля 2020

Я использую шаблон, который я нашел в inte rnet, чтобы разбить длинные строки на куски. Кажется, что он работает нормально с большинством текста, но если в этом предположительно длинном текстовом вводе есть сущность, такая как '&', это делает чанк вывода слишком длинным.

Мой потребитель этих данных нуждается в длинных значениях описания в определенных сущности, разбитые на куски фиксированной длины. Таким образом, эти данные в порядке:

<tag>
    <text>This is a long string 1This is a long string 2This is a long string 3This is a long string 4</text>
</tag>

результирующий вывод:

<?xml version="1.0" encoding="UTF-8"?>
<tag>
    <text>
      <text>This is a long string 1</text>
      <text>This is a long string 2</text>
      <text>This is a long string 3</text>
      <text>This is a long string 4</text>
   </text>
</tag>

эти данные слишком длинные здесь в первой выходной строке:

<tag>
    <text>&amp;This is a long string 1This is a long string 2This is a long string 3This is a long string 4</text>
</tag>

результирующий вывод :

<?xml version="1.0" encoding="UTF-8"?>
<tag>
    <text>
      <text>&amp;This is a long string </text>
      <text>1This is a long string </text>
      <text>2This is a long string </text>
      <text>3This is a long string </text>
      <text>4</text>
   </text>
</tag>

Я пытался изменить вывод на html, но это не изменило поведение - в любом случае вывод должен быть xml.

Я на самом деле не Конечно, если проблема действительно решаема, так как XML является только посредником, а фактический источник и назначение в конечном итоге являются полнотекстовым полем базы данных, но я бы хотел разделить длинную строку на короткие строки точно желаемой длины.

Вот шаблон .. здесь желаемый размер: 23

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:max="http://www.ibm.com/maximo" exclude-result-prefixes="max">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:variable name="pChunkSize" select="23" />

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

<xsl:template match="text/text()" name="chunk">
<xsl:param name="pText" select="."/>

<xsl:if test="string-length($pText) >0">
<text>
<xsl:value-of select=
   "substring($pText, 1, $pChunkSize)"/>
</text>
<xsl:call-template name="chunk">
<xsl:with-param name="pText"
    select="substring($pText, $pChunkSize+1)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

Я видел некоторое обсуждение по этому поводу, и это может быть трудно - начиная с рубки и в середине (если это было к конец сегмента) приводит к неверным XML.

1 Ответ

0 голосов
/ 26 апреля 2020

Вы правильно разделили текст на четыре части, каждая длиной 23 символа, и правильно представили каждую из этих 23-символьных строк в правильном представлении XML.

Если они не могут с этим справиться , это должно быть потому, что они не обрабатывают XML правильно, используя соответствующий парсер XML, поэтому проблема в их конце, а не в вашем.

...