0

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

2 回答 2

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)
    

    例如,您将获得输出为"Rod House Rods Way E"

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

    例如,您将获得所需的输出"Rod House Rods Way"

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

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

于 2012-10-30T11:03:16.703 回答
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>
于 2012-10-30T12:50:24.007 回答