I.任意の数の連続するスペースの開始グループを削除する非再帰的なXSLT1.0ソリューション:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p/text()">
<xsl:value-of select=
"substring-after
(.,
substring-before
(.,
substring
(translate(., ' ', ''), 1, 1)
)
)"/>
</xsl:template>
</xsl:stylesheet>
提供されたXMLドキュメントに適用する場合:
<Text>
<p> Sample Text.</p> <p> Sample Text..</p> <p> Sample Text.</p> <p> Sample Text.</p> <p> Sample Text.</p>
</Text>
必要な正しい結果が生成されます。
<Text>
<p>Sample Text.</p> <p>Sample Text..</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
説明:
アイデアは次のとおりです。
最初の非スペース文字を取得します。
この文字の前にあるスペースの文字列を取得します(1で取得)。
そのスペースの文字列の直後に続く文字列を取得します(2で取得)。
II。XSLT 2.0ソリューション:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p/text()">
<xsl:sequence select="replace(., '^\s+(.+)$', '$1')"/>
</xsl:template>
</xsl:stylesheet>
この変換が同じXMLドキュメント(上記)に適用されると、同じ正しい結果が生成されます。
<Text>
<p>Sample Text.</p> <p>Sample Text..</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
注意してください:
Martin Honnenは、次の使用を提案しています。
replace(., '^\s+', '')
これはより短いですが:
replace(., '^\s+(.+)$', '$1')
前者は一般に多くの個別の置換を実行しますが、後者は単一の置換を実行するため、より効率的です。
更新:OPはXSLT 2.0ソリューションを使用できませんでした、と彼は書いています:
スペースのように見えるものが実際にはタブである可能性があると今考えていますが、これを確認してから削除するにはどうすればよいですか?
解決策は次を使用することです。
replace(., '^[\s	 ]+(.+)$', '$1')