XSLT добавляет элементы динамически на основе длины входных данных - PullRequest
0 голосов
/ 05 марта 2020

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

Пример:

Например, в приведенном ниже сообщении вы можете видеть, что у нас есть элемент EncodedString , который содержит строку длиной 100 знаков И на выходе мы хотим иметь элемент EncodedStringValue 10 раз из-за максимального ограничения в 10 символов на объявление элемента. Обратите внимание, что в фактическом сценарии ограничение количества символов, которое мы можем иметь, может варьироваться от 10.

Ввод XML

<?xml version="1.0" encoding="UTF-8"?>
      <Message xmlns="http://ws.apache.org/ns/synapse">
         <MessageID>365</MessageID>
         <EncodedString>PHJvb3Q6SW52b2ljZSB4bWxuczpyb290PSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpJbnZv</EncodedString>
    </Message>

Ожидаемый вывод XML

<?xml version="1.0" encoding="UTF-8"?>
  <Message xmlns="http://ws.apache.org/ns/synapse">
     <MessageID>365</MessageID>
     <EncodedStringValue>PHJvb3Q6SW</EncodedStringValue>
     <EncodedStringValue>52b2ljZSB4</EncodedStringValue> 
     <EncodedStringValue>bWxuczpyb2</EncodedStringValue>
     <EncodedStringValue>90PSJ1cm46</EncodedStringValue>
     <EncodedStringValue>b2FzaXM6bm</EncodedStringValue>
     <EncodedStringValue>FtZXM6c3Bl</EncodedStringValue>
     <EncodedStringValue>Y2lmaWNhdG</EncodedStringValue>
     <EncodedStringValue>lvbjp1Ymw6</EncodedStringValue>
     <EncodedStringValue>c2NoZW1hOn</EncodedStringValue>
     <EncodedStringValue>hzZDpJbnZv</EncodedStringValue>
</Message>

Вопрос?

Можно ли выполнить вышеупомянутое требование с помощью XSLT? Если да, то как?

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

В XSLT 2.0 то же самое можно выполнить, как показано ниже:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://ws.apache.org/ns/synapse"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <Message>
            <xsl:apply-templates select="node()"/>
        </Message>
    </xsl:template>
    <xsl:template match="MessageID">
        <xsl:copy-of select="."></xsl:copy-of>
    </xsl:template>
    <xsl:template match="EncodedString">
        <xsl:variable name="rep">
            <xsl:value-of select="replace(.,'([0-9A-z]{1,10})','$1 ')"/>
        </xsl:variable>
        <xsl:for-each select="tokenize($rep,' ')[position()!=last()]">
            <EncodedStringValue>
                <xsl:value-of select="."/>
            </EncodedStringValue>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/gVhDDyA/4

2 голосов
/ 05 марта 2020

Разделить данные с помощью строковых функций, например, в XSLT с analyze-string:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://ws.apache.org/ns/synapse"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:output indent="yes"/>

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

  <xsl:template match="EncodedString">
      <xsl:apply-templates select="analyze-string(., '.{1,10}')/*:match">
          <xsl:with-param name="name" select="node-name()"/>
      </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="*:match">
      <xsl:param name="name"/>
      <xsl:element name="{$name}" namespace="{namespace-uri-from-QName($name)}">{.}</xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/6pS26ms

...