Картографирование сложных типов и размеров полей - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть XML-документ, который мне нужен для сопоставления поля описания из исходного XML-документа с конечным XML-документом по следующим критериям:

Исходный XML-документ Поле описания может иметь переменную длину 0 - 1000 символов.

Поле назначения содержит элемент PID сложного типа (EDI счета в формате xml). Каждый экземпляр PID должен иметь символ «F» в PID01 и 40 символов в поле PID05. Нам нужно сгенерировать достаточное количество элементов PID, чтобы вместить полное значение поля Description. Каждый PID05 должен хранить 40 символов, кроме последнего экземпляра PID, который будет иметь напоминания, чтобы он мог быть короче.

XML-сообщения http://i41.tinypic.com/6roosl.png

Кто-нибудь может подсказать, как мне это сделать в xslt?

Я предполагаю, что нам нужно посчитать размер поля описания, затем разделить его на 40, чтобы получить номер элемента PID, который нам нужно создать в целевом xml-сообщении, а затем скопировать каждый 40-символьный сегмент за раз, поместив ' F 'в PID01 и 40 символов в PID05?

Помощь очень ценится ...

Приветствия

Пример вывода:

<PID>
  <PID01>F</PID01>
  <PID05>The quick </PID05>
</PID>
<PID>
  <PID01>F</PID01>
  <PID05>brown fox </PID05>
</PID>
<PID>
  <PID01>F</PID01>
  <PID05>jumped over</PID05>
</PID>

1 Ответ

1 голос
/ 02 декабря 2011

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

Например,рассмотрим этот элемент

<text>The quick brown fox jumps over the lazy dog</text>

Затем, используя следующий XSLT

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

   <xsl:param name="splitLength" select="10"/>

   <!-- Pad out a string with excess characters -->
   <xsl:template name="pad">
      <xsl:param name="padChar" />
      <xsl:param name="count" select="$splitLength" />
      <xsl:value-of select="$padChar" />
      <xsl:if test="$count &gt; 1">
         <xsl:call-template name="pad">
            <xsl:with-param name="padChar" select="$padChar" />
            <xsl:with-param name="count" select="$count - 1" />
         </xsl:call-template>
      </xsl:if>
   </xsl:template>

   <xsl:template match="/text">
      <xsl:call-template name="splitter">
         <xsl:with-param name="text" select="text()"/>
      </xsl:call-template>
   </xsl:template>

   <xsl:template name="splitter">
      <xsl:param name="text"/>
      <PID>
         <PID01>F</PID01>
         <PID05>
            <xsl:value-of select="substring($text, 1, $splitLength)"/>
            <xsl:if test="string-length($text) &lt; $splitLength">
               <xsl:call-template name="pad">
                  <xsl:with-param name="padChar" select="' '" />
                  <xsl:with-param name="count" select="$splitLength - string-length($text)" />
               </xsl:call-template>
            </xsl:if>
         </PID05>
      </PID>
      <xsl:if test="string-length($text) &gt; $splitLength">
         <xsl:call-template name="splitter">
            <xsl:with-param name="text" select="substring($text, $splitLength + 1, string-length($text))"/>
         </xsl:call-template>
      </xsl:if>
   </xsl:template>
</xsl:stylesheet>

Затем выдается следующее:

<PID>
   <PID01>F</PID01>
   <PID05>The quick </PID05>
</PID>
<PID>
   <PID01>F</PID01>
   <PID05>brown fox </PID05>
</PID>
<PID>
   <PID01>F</PID01>
   <PID05>jumps over</PID05>
</PID>
<PID>
   <PID01>F</PID01>
   <PID05> the lazy </PID05>
</PID>
<PID>
   <PID01>F</PID01>
   <PID05>dog       </PID05>
</PID>

Примечание. Здесь я параметризовал длину разделенияи установите его на 10, а не 40, просто в качестве примера.

Не существует также именованного шаблона, который дополняет точную длину последнего элемента PID05 (в нашем случае 10).

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