我生成了以下XML:
<InvoiceStreet>Rod House Rods Way Euro Industrial Estate</InvoiceStreet>
这包含空格,我想使用xslt将其转换为以下内容:
<AddressLine>Rod House Rods Way</AddressLine>
<AddressLine>Euro Industrial Estate</AddressLine>
目前我只能这样输出:
<AddressLine>Rod House Rods Way
Euro Industrial Estate</AddressLine>
有没有办法使用XSLT做到这一点?
以下是我目前的情况:
<Address>
<AddressLine>
<xsl:value-of select="/*/*/*/*/*/xsales:DeliveryStreet" />
</AddressLine>
</Address>
答案 0 :(得分:1)
使用substring Function,请尝试使用这段代码片段:
<Address>
<AddressLine>
<xsl:value-of select="substring(/*/*/*/*/*/xsales:DeliveryStreet,0,18)" />
</AddressLine>
<AddressLine>
<xsl:value-of select="substring(/*/*/*/*/*/xsales:DeliveryStreet,19,22)" />
</AddressLine>
</Address>
更好的方法
获取完整地址的长度。例如上面提供的样本字符串的长度为41。
<xsl:variable name="addressLength" select="string-length(/*/*/*/*/*/xsales:DeliveryStreet)" />
将长度除以2并截断浮动部分,即你将得到20
<xsl:variable name="splitLength" select="$addressLength / 2" />
现在将子串函数从零(0)应用到splitLength
变量
substring(/*/*/*/*/*/xsales:DeliveryStreet, 0, $splitLength)
e.g。您将获得"Rod House Rods Way E"
再次使用LastIndexOf
模板将子字符串函数应用到最后一次出现的空间。
e.g。您将获得所需的输出"Rod House Rods Way"
对于LastIndexOf
模板方法,您可以参考这篇文章XSLT: Finding last occurance in a string
希望这能解决您的动态地址问题,干杯!
答案 1 :(得分:1)
根据您发布的输出,输入显示<xsales:DeliveryAddress>
地址的组件由换行符分隔。
如果是这样,您可以在换行符上拆分xsales:DeliveryAddress
并使用寻找换行符的递归模板将每行放入其自己的<AddressLine>
中,创建新的<AddressLine>
对于换行前的内容,然后通过后续调用模板处理后面的文本:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsales="xsales"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mailplus="http://api.mailplus.nl/rss/mailplus/">
<xsl:output method="html" indent="yes"/>
<xsl:param name="ItemsToShow" select="2"/>
<xsl:param name="ShowItemDetails"/>
<xsl:param name="ShowItemDate"/>
<xsl:param name="Locale"/>
<xsl:param name="Target"/>
<xsl:template match="rss">
<Address>
<xsl:call-template name="AddressLines">
<xsl:with-param name="txt"
select="/*/*/*/*/*/xsales:DeliveryStreet"/>
</xsl:call-template>
</Address>
</xsl:template>
<xsl:template name="AddressLines">
<xsl:param name="txt"/>
<!--default value for delimiter to use line-feed character -->
<xsl:param name="delimiter" select="'
'"/>
<xsl:choose>
<xsl:when test="contains($txt, $delimiter)">
<AddressLine>
<xsl:value-of select="normalize-space(
substring-before($txt,
$delimiter))"/>
</AddressLine>
<xsl:call-template name="AddressLines">
<xsl:with-param name="txt"
select="substring-after($txt,
$delimiter)"/>
<xsl:with-param name="delimiter" select="$delimiter"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!--filter out whitespace-only lines(from trailing line feeds)-->
<xsl:if test="normalize-space($txt)">
<AddressLine>
<xsl:value-of select="$txt"/>
</AddressLine>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>