检查字符串长度并附加一个字符以使其长度恒定

Pat*_*tan 3 xslt xslt-1.0

<Data>
<AA>123</AA>
  <AA>45658</AA>
  <AA>123456789</AA> 
</Data>
Run Code Online (Sandbox Code Playgroud)

需要的输出:

<info>
  <Numbers id="000000123" />
  <Numbers id="000045658" />
  <Numbers id="123456789" />
</info>
Run Code Online (Sandbox Code Playgroud)

健康)状况:

我需要检查元素 AA 的字符串长度。如果长度小于 9,我需要附加 '0' 以使其长度为 9 位。

XSLT 写道:

<xsl:template match="Data">   
  <info>
       <xsl:for-each select="AA">
              <Numbers>
                <xsl:attribute name="id">
                  <xsl:variable name="numlenght">
                  <xsl:value-of select="string-length(.)" />
                    </xsl:variable>
                  <xsl:choose>
                    <xsl:when test="$numlenght&lt;9">
                      <xsl:variable name="balance">
                        <xsl:value-of select="9-$numlenght"/>
                      </xsl:variable>
                      <xsl:for-each select="//*[position() &lt;$balance]">
                        <xsl:value-of select="'0'"/>
                      </xsl:for-each>

                    </xsl:when>
                                      </xsl:choose>
                  <xsl:value-of select="."/>

                </xsl:attribute>
              </Numbers>
            </xsl:for-each>
  </info>
        </xsl:template>
Run Code Online (Sandbox Code Playgroud)

我没有得到确切的输出。

任何人都可以建议如何做到这一点?

Dim*_*hev 5

这需要更少的内存

concat(substring('000000000', string-length() +1), .)
Run Code Online (Sandbox Code Playgroud)

这是一个完整的转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <info><xsl:apply-templates/></info>
 </xsl:template>

 <xsl:template match="AA">
  <Numbers id="{concat(substring('000000000', string-length() +1), .)}"/>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

当此转换应用于提供的 XML 文档时:

<Data>
    <AA>123</AA>
    <AA>45658</AA>
    <AA>123456789</AA>
</Data>
Run Code Online (Sandbox Code Playgroud)

产生了想要的、正确的结果

<info>
   <Numbers id="000000123"/>
   <Numbers id="000045658"/>
   <Numbers id="123456789"/>
</info>
Run Code Online (Sandbox Code Playgroud)

说明

表达方式:

concat(substring('000000000', string-length() +1), .)
Run Code Online (Sandbox Code Playgroud)

不构造长度大于 9 的字符串(如在另一个答案中,在此之后提取长度超过 9 个字符的字符串的子字符串)。

相反,它仅提取填充0字符数所需的字符,然后将它们连接到当前节点的字符串值。

请注意

  <Numbers id="{concat(substring('000000000', string-length() +1), .)}"/>
Run Code Online (Sandbox Code Playgroud)

可以进一步简化为

  <Numbers id="{substring('000000000', string-length() +1)}{.}"/>
Run Code Online (Sandbox Code Playgroud)