空白文本操作

时间:2012-10-30 10:34:26

标签: xslt

我生成了以下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>

2 个答案:

答案 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>

更好的方法

  1. 获取完整地址的长度。例如上面提供的样本字符串的长度为41。

    <xsl:variable name="addressLength" select="string-length(/*/*/*/*/*/xsales:DeliveryStreet)" />
    
  2. 将长度除以2并截断浮动部分,即你将得到20

    <xsl:variable name="splitLength" select="$addressLength / 2" />
    
  3. 现在将子串函数从零(0)应用到splitLength变量

    substring(/*/*/*/*/*/xsales:DeliveryStreet, 0, $splitLength)
    

    e.g。您将获得"Rod House Rods Way E"

  4. 的输出
  5. 再次使用LastIndexOf模板将子字符串函数应用到最后一次出现的空间。

    e.g。您将获得所需的输出"Rod House Rods Way"

    对于LastIndexOf模板方法,您可以参考这篇文章XSLT: Finding last occurance in a string

  6. 希望这能解决您的动态地址问题,干杯!

答案 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="'&#xA;'"/>
        <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>