<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<9">
<xsl:variable name="balance">
<xsl:value-of select="9-$numlenght"/>
</xsl:variable>
<xsl:for-each select="//*[position() <$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>
我没有得到确切的输出。
任何人都可以建议如何做到吗?
答案 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)