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 未満の場合は、長さを 9 桁にするために「0」を追加する必要があります。

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 と部分文字列を使用して、次のようにしてみてください。

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