<Address>
1234Road
Unit 5 Lane
Town, City
SO1D 23Z
Customer No. 12321312312
</Address>
<Address>
21321311234Road
1234Road
Unit 5 Lane
Town, City
SO1D 23Z
Customer No. 12321312312
</Address>
任何人都可以帮我永远记住邮政编码的价值,这些价值总是在客户编号之前吗?
<xsl:value-of select="substring-before(substring-after(substring-after(substring-after(Address,' '),' '),' '),' ')"/>
我已经使用了上述内容,但不会在第二个例子中使用。需要找到一种方法来接下一个。
注意:每行之间都有换行符(CRLF)。
非常感谢任何帮助
答案 0 :(得分:2)
一种可能的方法是创建一个递归的“substring-after-last”命名模板,并使用传入“Customer No.”之前出现的子字符串
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="Address">
<xsl:call-template name="substring-after-last">
<xsl:with-param name="text" select="$exCust" />
<xsl:with-param name="arg" select="' '" />
</xsl:call-template>
</xsl:template>
<xsl:template name="substring-after-last">
<xsl:param name="text" />
<xsl:param name="arg" />
<xsl:variable name="after" select="substring-after($text, $arg)" />
<xsl:choose>
<xsl:when test="contains($after, $arg)">
<xsl:call-template name="substring-after-last">
<xsl:with-param name="text" select="$after" />
<xsl:with-param name="arg" select="$arg" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$after" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
如果您只处理英国邮政编码,其长度在6到8个字符之间(包括空格),您可以通过非常粗略的方法来完成....
<xsl:variable name="exCust" select="substring-before(., ' Customer No. ')" />
<xsl:value-of select="substring-after(substring($exCust, string-length($exCust) - 8, 9), ' ')" />
这有点像黑客,如果前面的城镇/城市长度是一个字符,也会失败!
答案 1 :(得分:1)
这在XSLT 1.0中相当繁琐 - 我建议你按照以下几点尝试:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<!-- ... -->
<xsl:template match="Address">
<xsl:variable name="tokens">
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:variable>
<postcode>
<xsl:value-of select="exsl:node-set($tokens)/token[last() - 1]"/>
</postcode>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
<xsl:if test="$token">
<token>
<xsl:value-of select="$token"/>
</token>
</xsl:if>
<xsl:if test="contains($text, $delimiter)">
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>