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

我没有得到确切的输出。

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

4

2 回答 2

5

这需要更少的内存

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)}{.}"/>
于 2012-08-29T12:15:21.867 回答
2

尝试使用 Concat 和 substring 使其如下所示:

susbstring(concat('000000000',yourstring),string-length()-9,9)
于 2012-08-29T07:51:04.053 回答