【问题标题】:WSO2 how to pad a property value with a large quantity of digitsWSO2如何用大量数字填充属性值
【发布时间】:2020-06-22 14:08:02
【问题描述】:

我正在开发一个需要创建平面文件的 WSO2 集成 - 所以基本上,一个只有 1 列的文件,该列有 200 个字符宽,并且对于哪些值进入哪些位置有一个特定的协议。例如 -

  • 位置 1-3 = 记录类型
  • 位置 4 = 空格
  • 位置 5-20 = 名字
  • 位置 21 = 空格
  • 位置 22-32 = 姓氏

等等等等

所以在那个例子中,姓氏有 10 个“数字”,这意味着如果这个人的姓氏是 Smith,我需要用 5 个后续的额外空格填充属性 - 比如 'Smith(后跟 5 个空格)'。我使用substring(concat('$ctx:LastName', ' '), 1, 10) 找到了简单的解决方案。这似乎适用于较小尺寸的填充占位符。但是,我遇到的问题是我填充的某些字段需要超过 100 个字符。而且我真的不想在我的单引号之间计算 100 个空格。在 WSO2 中处理这类事情有什么优雅的解决方案吗?

谢谢。

【问题讨论】:

    标签: xml xpath wso2 padding


    【解决方案1】:

    代码:

    [#assign firstName1 = "john"]
    [#assign lastName1 = "doe"]
    [#assign firstName2 = "abcdefghijklmnopqrstuvwxyz"]
    [#assign lastName2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
    [#assign firstNameMaxLength = 20]
    [#assign lastNameMaxLength = 10]
    [#assign placeholder = "-"]
    
    [#function getMyProperty input outputMaxLength placeholder]
        [#if input?length > outputMaxLength]
            [#return input?substring(0,outputMaxLength)]
        [/#if]
        [#return input?right_pad(outputMaxLength,placeholder)]
    [/#function]
    
    <br>code1:${getMyProperty(firstName1,firstNameMaxLength,placeholder)}${getMyProperty(lastName1,lastNameMaxLength,placeholder)}
    <br>code2:${getMyProperty(firstName2,firstNameMaxLength,placeholder)}${getMyProperty(lastName2,lastNameMaxLength,placeholder)}
    

    输出:

    code1:john----------------doe------- 
    code2:abcdefghijklmnopqrstABCDEFGHIJ
    

    【讨论】:

      【解决方案2】:

      基于this answer 中的方法,您可以执行以下操作:

      substring(concat('Smith', string-join((1 to 50)!"_")), 1, 10)
      

      哪些输出:

      '史密斯____'

      该表达式基本上创建了一个由 50 个(或任何您想要的)空格组成的字符串,将其连接到 'Smith' 并将整个内容缩减为 10 个字符。

      【讨论】:

      • 谢谢杰克,这看起来确实是我正在做的事情的完美解决方案。不过,我似乎无法让 WSO2 识别字符串连接。我在我的 synapse.properties 文件中取消了“synapse.xpath.dom.failover.enabled=true”行的注释,但是每次我尝试将其放入时,我都会收到“属性表达式的 XPath 表达式无效”。
      • @SeanWesche string-join() 是一种 xpath 2.0 方法。这不是我真正的领域,但似乎需要明确启用 xpath 2.0;看看这里:stackoverflow.com/a/55351665/9448090
      【解决方案3】:

      我最终使用了一个 smooks 调解器来处理这个问题。

      <?xml version="1.0" encoding="UTF-8"?>
      <localEntry key="padEntries-smooks-config" xmlns="http://ws.apache.org/ns/synapse">
          <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:file="http://www.milyn.org/xsd/smooks/file-routing-1.1.xsd" xmlns:fl="http://www.milyn.org/xsd/smooks/fixed-length-1.3.xsd" xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd">
              <params>
                  <param name="stream.filter.type">SAX</param>
                  <param name="default.serialization.on">false</param>
              </params>
              <resource-config selector="Employee180,Employee181,Employee220Domestic,Employee220Foreign,Employee240">
                  <resource>org.milyn.delivery.DomModelCreator</resource>
              </resource-config>
              <ftl:freemarker applyOnElement="Employee180">
                  <ftl:template>
                      <!--${.vars["Employee180"].RecordType?right_pad(3)}${.vars["Employee180"].BlankSpace1?right_pad(1)}${.vars["Employee180"].ContractNumber?right_pad(6)}${.vars["Employee180"].BlankSpace2?right_pad(1)}${.vars["Employee180"].EmployeeIDNumber?right_pad(9)?replace("-","")}${.vars["Employee180"].BlankSpace3?right_pad(1)}${.vars["Employee180"].EmployeeName?right_pad(24)}${.vars["Employee180"].DateOfBirth?right_pad(10)}${.vars["Employee180"].BlankSpace4?right_pad(1)}${.vars["Employee180"].DateOfEmployment?right_pad(10)}${.vars["Employee180"].BlankSpace5?right_pad(1)}${.vars["Employee180"].Sex?right_pad(1)}${.vars["Employee180"].BlankSpace6?right_pad(8)}${.vars["Employee180"].SocialSecurityNumber?right_pad(9)}${.vars["Employee180"].BlankSpace7?right_pad(133)}${.vars["Employee180"].BenefitEventDate?right_pad(10)}${.vars["Employee180"].BlankSpace8?right_pad(5)}${.vars["Employee180"].BenefitEventReason?right_pad(4)}${.vars["Employee180"].BlankSpace9?right_pad(3)}${'\r\n'} -->
                  </ftl:template>
              </ftl:freemarker>
              <ftl:freemarker applyOnElement="Employee220Domestic">
                  <ftl:template>
                      <!--${.vars["Employee220Domestic"].RecordType?right_pad(3)}${.vars["Employee220Domestic"].BlankSpace1?right_pad(1)}${.vars["Employee220Domestic"].ContractNumber?right_pad(6)}${.vars["Employee220Domestic"].BlankSpace2?right_pad(1)}${.vars["Employee220Domestic"].EmployeeIDNumber?right_pad(9)}${.vars["Employee220Domestic"].BlankSpace3?right_pad(1)}${.vars["Employee220Domestic"].ForeignIndicator?right_pad(1)}${.vars["Employee220Domestic"].BlankSpace4?right_pad(1)}${.vars["Employee220Domestic"].AddressLine1?right_pad(50)}${.vars["Employee220Domestic"].AddressLine2?right_pad(50)}${.vars["Employee220Domestic"].AddressLine3?right_pad(50)}${.vars["Employee220Domestic"].City?right_pad(30)}${.vars["Employee220Domestic"].State?right_pad(2)}${.vars["Employee220Domestic"].Zip?right_pad(9)}${.vars["Employee220Domestic"].BlankSpace5?right_pad(26)}${'\r\n'} -->
                  </ftl:template>
              </ftl:freemarker>
              <ftl:freemarker applyOnElement="Employee220Foreign">
                  <ftl:template>
                      <!--${.vars["Employee220Foreign"].RecordType?right_pad(3)}${.vars["Employee220Foreign"].BlankSpace1?right_pad(1)}${.vars["Employee220Foreign"].ContractNumber?right_pad(6)}${.vars["Employee220Foreign"].BlankSpace2?right_pad(1)}${.vars["Employee220Foreign"].EmployeeIDNumber?right_pad(9)}${.vars["Employee220Foreign"].BlankSpace3?right_pad(1)}${.vars["Employee220Foreign"].ForeignIndicator?right_pad(1)}${.vars["Employee220Foreign"].BlankSpace4?right_pad(1)}${.vars["Employee220Foreign"].AddressLine1?right_pad(50)}${.vars["Employee220Foreign"].AddressLine2?right_pad(50)}${.vars["Employee220Foreign"].AddressLine3?right_pad(50)}${.vars["Employee220Foreign"].AddressLine4?right_pad(50)}${.vars["Employee220Foreign"].BlankSpace5?right_pad(17)}${'\r\n'} -->
                  </ftl:template>
              </ftl:freemarker>
              <ftl:freemarker applyOnElement="Employee240">
                  <ftl:template>
                      <!--${.vars["Employee240"].RecordType?right_pad(3)}${.vars["Employee240"].ContractNumber?right_pad(6)}${.vars["Employee240"].EmployeeIDNumber?right_pad(9)}${.vars["Employee240"].WorkEmailAddress?right_pad(75)}${.vars["Employee240"].PersonalEmailAddress?right_pad(75)}${.vars["Employee240"].WorkPhoneNumber?right_pad(17)}${.vars["Employee240"].WorkPhoneNumberExt?right_pad(7)}${.vars["Employee240"].HomePhoneNumber?right_pad(17)}${.vars["Employee240"].HomePhoneNumberExt?right_pad(7)}${.vars["Employee240"].MobilePhoneNumber?right_pad(18)}${'\r\n'} -->
                  </ftl:template>
              </ftl:freemarker>
              <ftl:freemarker applyOnElement="Employee181">
                  <ftl:template>
                      <!--${.vars["Employee181"].RecordType?right_pad(3)}${.vars["Employee181"].BlankSpace1?right_pad(1)}${.vars["Employee181"].ContractNumber?right_pad(6)}${.vars["Employee181"].BlankSpace2?right_pad(1)}${.vars["Employee181"].EmployeeIDNumber?right_pad(9)}${.vars["Employee181"].BlankSpace3?right_pad(1)}${.vars["Employee181"].EmployeeName?right_pad(24)}${.vars["Employee181"].BlankSpace4?right_pad(31)}${.vars["Employee181"].SocialSecurityNumber?right_pad(9)}${.vars["Employee181"].BlankSpace5?right_pad(1)}${.vars["Employee181"].RehireDate?right_pad(10)}${.vars["Employee181"].BlankSpace6?right_pad(144)}${'\r\n'} -->
                  </ftl:template>
              </ftl:freemarker>
          </smooks-resource-list>
      </localEntry>
      

      【讨论】:

        猜你喜欢
        • 2020-11-28
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        相关资源
        最近更新 更多