<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<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>
Run Code Online (Sandbox Code Playgroud)
我没有得到确切的输出。
任何人都可以建议如何做到这一点?
这需要更少的内存:
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)