17

この関数normalize-spaceは、空白のシーケンスを単一のスペースに置き換え、指定された文字列をトリミングします。空白を置き換えずに文字列のみをトリミングするにはどうすればよいですか?のような独自のソリューションがありますがorcl:left-trim、私は非独自のソリューションを探しています。

例:

<xsl:value-of select="trim(/Car/Description)"/>

回転する必要があります

<car>
  <description>  To get more information look at:     www.example.com </description>
</car>

の中へ

"To get more information look at:     www.example.com"
4

5 に答える 5

17

xslt 1.0テンプレートのみを使用するソリューション:

<xsl:variable name="whitespace" select="'&#09;&#10;&#13; '" />

<!-- Strips trailing whitespace characters from 'string' -->
<xsl:template name="string-rtrim">
    <xsl:param name="string" />
    <xsl:param name="trim" select="$whitespace" />

    <xsl:variable name="length" select="string-length($string)" />

    <xsl:if test="$length &gt; 0">
        <xsl:choose>
            <xsl:when test="contains($trim, substring($string, $length, 1))">
                <xsl:call-template name="string-rtrim">
                    <xsl:with-param name="string" select="substring($string, 1, $length - 1)" />
                    <xsl:with-param name="trim"   select="$trim" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$string" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:if>
</xsl:template>

<!-- Strips leading whitespace characters from 'string' -->
<xsl:template name="string-ltrim">
    <xsl:param name="string" />
    <xsl:param name="trim" select="$whitespace" />

    <xsl:if test="string-length($string) &gt; 0">
        <xsl:choose>
            <xsl:when test="contains($trim, substring($string, 1, 1))">
                <xsl:call-template name="string-ltrim">
                    <xsl:with-param name="string" select="substring($string, 2)" />
                    <xsl:with-param name="trim"   select="$trim" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$string" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:if>
</xsl:template>

<!-- Strips leading and trailing whitespace characters from 'string' -->
<xsl:template name="string-trim">
    <xsl:param name="string" />
    <xsl:param name="trim" select="$whitespace" />
    <xsl:call-template name="string-rtrim">
        <xsl:with-param name="string">
            <xsl:call-template name="string-ltrim">
                <xsl:with-param name="string" select="$string" />
                <xsl:with-param name="trim"   select="$trim" />
            </xsl:call-template>
        </xsl:with-param>
        <xsl:with-param name="trim"   select="$trim" />
    </xsl:call-template>
</xsl:template>

テストコード:

<ltrim>
    <xsl:call-template name="string-ltrim">
        <xsl:with-param name="string" select="'   &#10;   test  '" />
    </xsl:call-template>
</ltrim>
<rtrim>
    <xsl:call-template name="string-rtrim">
        <xsl:with-param name="string" select="'    &#10;    test  &#10;  '" />
    </xsl:call-template>
</rtrim>
<trim>
    <xsl:call-template name="string-trim">
        <xsl:with-param name="string" select="'    &#10;    test  &#10;  '" />
    </xsl:call-template>
</trim>

出力:

<test>
    <ltrim>test  </ltrim>
    <rtrim>   
    test</rtrim>
    <trim>test</trim>
</test>
于 2012-12-20T14:49:33.280 に答える
4

FXSL (XSLT関数型プログラミング用のオープンソースライブラリ、完全にXSLTで記述)を使用すると、のように記述できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="trim.xsl"/>

  <xsl:output method="text"/>
  <xsl:template match="/*/description">
    '<xsl:call-template name="trim">
        <xsl:with-param name="pStr" select="."/>
    </xsl:call-template>'
  </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<car>
  <description>  To get more information look at:     www.example.com </description>
</car>

必要な正しい結果が生成されます。

'To get more information look at:     www.example.com'

trimテンプレートはどのように機能しますか?

左の先頭の空白をトリミングし、次に結果の文字列を反転して先頭の空白をトリミングし、最後に結果の文字列を反転します。


II。XPath 2.0ソリューション

使用

replace(replace(/*/description, '^\s*(.+?)\s*$', '$1'), '^ .*$', '')

XSLT-2.0ベースの検証は次のとおりです。

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
     "<xsl:sequence 
      select="replace(replace(/*/description, '^\s*(.+?)\s*$', '$1'), '^ .*$', '')"/>"
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメント(上記)に適用されると、XPath式が評価され、この評価の結果が出力にコピーされます。

 "To get more information look at:     www.example.com"
于 2012-12-20T14:39:36.767 に答える
4

normalize-space(actualSting)-これで実行されます。

于 2014-11-02T07:11:20.980 に答える
3

XSLT1を使用した非常に短いソリューション:

<xsl:template name="trim">
            <xsl:param name="str"/>

            <xsl:choose>
                <xsl:when test="string-length($str) &gt; 0 and substring($str, 1, 1) = ' '">
                    <xsl:call-template name="trim"><xsl:with-param name="str"><xsl:value-of select="substring($str, 2)"/></xsl:with-param></xsl:call-template></xsl:when>
                <xsl:when test="string-length($str) &gt; 0 and substring($str, string-length($str)) = ' '">
                    <xsl:call-template name="trim"><xsl:with-param name="str"><xsl:value-of select="substring($str, 1, string-length($str)-1)"/></xsl:with-param></xsl:call-template></xsl:when>
                <xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise>
            </xsl:choose>
        </xsl:template>
于 2015-05-26T15:46:24.440 に答える
-2

中央にスペースがない場合は、次を使用できます。

translate(/Car/Description,' ','')
于 2014-08-27T18:46:44.547 に答える