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

部分文字列 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 occurance in a stringを参照できます。

これで動的アドレスの問題が解決されることを願っています。

于 2012-10-30T11:03:16.703 に答える
1

投稿した出力から、入力には<xsales:DeliveryAddress>改行文字で区切られた住所のコンポーネントが含まれているようです。

その場合は、改行文字を探し、改行の前に新しい for content を作成し、その後のテキストを後続の呼び出しで処理する再帰テンプレートを使用して、改行で分割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 に答える