Если условие для проверки длины строки в XSLT и Mapping - PullRequest
0 голосов
/ 28 января 2019

У меня есть требование, в котором я должен проверить длину строки поля REF.Если оно меньше 6, нам нужно добавить 0 в префиксе, иначе вывести значение.

Мы отображаем значение XB в REF, предоставляя XPath.Я новичок в этом и попробовал пару утверждений, но это не сработало для меня.

Ввод:

<Group xmlns="">
  <ITM xmlns="">
     <>
     <>   
    <REF>123</REF>
     <>
     <>
  </ITM>
</Group>

Ввод:

<FID>
  <ID>
    <ED>
       Hard coded values
     </ED>
      <E1>
        <XB>000123</XB>
       </E1>

  </ID>
</FID>

XSLT:

           <?xml version="1.0" encoding="UTF-8"?>
         <xsl:stylesheet version="2.0" 
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result- 
             prefixes="#all" >

          <xsl:output method="xml"  indent="yes" omit-xml-declaration="yes" 
                />
             <xsl:template match="/">

                 <FID>
                         <ID>
                                  <ED>
                                  <xsl:element name="TA">
                    <xsl:text>ED1</xsl:text>
                </xsl:element>
                <xsl:element name="MA">
                    <xsl:text>123</xsl:text>
                </xsl:element>
                <xsl:element name="DOC">
                    <xsl:text>0000</xsl:text>
                </xsl:element>
                <xsl:element name="DOCL">
                    <xsl:text>731</xsl:text>
                </xsl:element>
                <xsl:element name="STA">
                    <xsl:text>53</xsl:text>
                </xsl:element>
                <xsl:element name="DIR">
                    <xsl:text>2</xsl:text>
                    </xsl:element>
        </ED>
  <E1> 
  <xsl:element name="BU">
                    <xsl:value-of select="Mapping by giving XPATH"/>
                </xsl:element>
                <xsl:element name="BL">
                    <xsl:value-of select=""/>
                </xsl:element>
                <xsl:element name="BL">
                    <xsl:value-of select=""/>
                </xsl:element>
                <xsl:element name="BU">
                    <xsl:value-of select=""/>
                </xsl:element>
                <xsl:element name="WW">
                    <xsl:value-of select=""/>
                </xsl:element>
                <xsl:element name="TC">
                    <xsl:text>FB01</xsl:text>
                </xsl:element>
                <xsl:element name="XB">
                    <xsl:value-of select="Need to Map REF value here with 
                 condition"/>
                </xsl:element>
                <xsl:element name="WA">
                    <xsl:value-of select=""/>
                </xsl:element>
        </E1>
      </ID>
     </FID>

Теперь для XB мне нужно выполнить условие, если ономеньше 6, тогда нам нужно добавить 0 в префиксе, иначе выведите значение.

1 Ответ

0 голосов
/ 29 января 2019

Если ваши имена элементов статичны, проще (меньше печатать и легче читать) использовать литералы элементов.Вместо конструктора xsl:element name="XB"> просто используйте <XB>.Как правило, единственное время, когда вам нужно использовать xsl:element, это когда имя элемента динамически создается.

Из вашего примера XML я предполагаю, что XPath, указывающий на ваш элемент REF, был /Group/ITM/REF.

Если значение REF всегда является числом, то format-number() будет самым простым:

<XB>
  <xsl:value-of select="format-number(/Group/ITM/REF, '000000')"/>
</XB>

Если значение REF является строкой, тоВы могли бы concat() использовать substring()

<XB>
  <xsl:variable name="$ref" select="/Group/ITM/REF"/>
  <xsl:variable name="pad" select="'000000'"/>
  <xsl:value-of select="substring(
                          concat($pad, $ref), 
                          string-length($ref) + 1, 
                          string-length($pad)
                        )"/>
</XB>

Применение к вашему XSLT:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="#all" >

    <xsl:output method="xml"  indent="yes" omit-xml-declaration="yes" />
    <xsl:template match="/">
        <FID>
            <ID>
                <ED>
                   <TA>ED1</TA>
                   <MA>123</MA>
                   <DOC>0000</DOC>
                   <DOCL>731</DOCL>
                   <STA>53</STA>
                   <DIR>2</DIR>
                </ED>
                <E1> 
                    <BU>
                        <xsl:value-of select="Mapping by giving XPATH"/>
                    </BU>
                    <BL><xsl:value-of select=""/></BL>
                    <BL><xsl:value-of select=""/></BL>
                    <BU><xsl:value-of select=""/></BU>
                    <WW><xsl:value-of select=""/></WW>
                    <TC><xsl:text>FB01</xsl:text></TC>
                    <XB>
                        <xsl:value-of select="format-number(/Group/ITM/REF, '000000')"/>
                    </XB>
                    <WA><xsl:value-of select=""/></WA>
                </E1>
            </ID>
        </FID>
    </xsl:template>

</xsl:stylesheet>
...