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

时间:2012-08-29 07:42:00

标签: xslt xslt-1.0

<Data>
<AA>123</AA>
  <AA>45658</AA>
  <AA>123456789</AA> 
</Data>

需要输出:

<info>
  <Numbers id="000000123" />
  <Numbers id="000045658" />
  <Numbers id="123456789" />
</info>

条件:

我需要检查元素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>

我没有得到确切的输出。

任何人都可以建议如何做到吗?

2 个答案:

答案 0 :(得分:4)

这需要更少的内存

concat(substring('000000000', string-length() +1), .)

这是一个完整的转型

<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>

在提供的XML文档上应用此转换时:

<Data>
    <AA>123</AA>
    <AA>45658</AA>
    <AA>123456789</AA>
</Data>

产生了想要的正确结果

<info>
   <Numbers id="000000123"/>
   <Numbers id="000045658"/>
   <Numbers id="123456789"/>
</info>

<强>解释

表达式:

concat(substring('000000000', string-length() +1), .)

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

相比之下,它只提取填充0个字符的必要条件,然后将它们连接到当前节点的字符串值。

请注意

:此

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

可以进一步简化为

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

答案 1 :(得分:2)

尝试使用Concat和substring来实现这样:

susbstring(concat('000000000',yourstring),string-length()-9,9)