如果条件检查XSLT和映射中的字符串长度

时间:2019-01-28 12:22:52

标签: xslt xslt-2.0

我有一个要求,我必须检查字段REF的字符串的长度。如果小于6,则需要在前缀后附加0,否则打印该值。

我们通过提供XPath将XB值映射到REF。我是初学者,尝试了几次声明,但对我而言不起作用。

输入:

<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 :(得分:0)

如果元素名称是静态的,则使用元素文字更容易(更少的键入且更易于阅读)。不用xsl:element name="XB">构造函数,只需使用<XB>。通常,只有在动态构造元素名称时,才需要使用xsl:element

根据您的示例XML,我假设指向您的REF元素的XPath是/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>