XSLはXMLにXMLを変換するためのものですが、あなただけのXSLTを使用してXSLを使用して、行区切りリストを適切なxhtmlリストに変換できますか?
<ol>
<li>line1</li>
<li>line 2 -- foo</li>
<li>line 3</li>
</ol>
に
line1
line 2 -- foo
line 3
などのファイルを変換することができますか?
XSLはXMLにXMLを変換するためのものですが、あなただけのXSLTを使用してXSLを使用して、行区切りリストを適切なxhtmlリストに変換できますか?
<ol>
<li>line1</li>
<li>line 2 -- foo</li>
<li>line 3</li>
</ol>
に
line1
line 2 -- foo
line 3
などのファイルを変換することができますか?
これはXSLT 2.0に簡単でもXSLT 1.0に困難ではない。この変換は次のXML文書に適用され
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<ol>
<xsl:apply-templates/>
</ol>
</xsl:template>
<xsl:template match="text()" name="linesToLi">
<xsl:param name="pText" select="."/>
<xsl:if test="string-length($pText) > 0">
<xsl:variable name="vthisLine" select=
"substring-before(concat($pText, '
'), '
')"/>
<li><xsl:value-of select="$vthisLine"/></li>
<xsl:call-template name="linesToLi">
<xsl:with-param name="pText" select="substring-after($pText, '
')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
(提供されたテキストは、一番上の要素にまとめられ、整形式のXML文書になります)
望んでいた、正しい結果がを生産している:
<ol>
<li>line1</li>
<li>line 2 -- foo</li>
<li>line 3</li>
</ol>
II。 XSLT 2.0ソリューション:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vText" as="xs:string">
line1
line 2 -- foo
line 3
</xsl:variable>
<xsl:template match="/">
<ol>
<xsl:for-each select=
"tokenize($vText, '\r?\n')[normalize-space()]">
<li><xsl:sequence select="."/></li>
</xsl:for-each>
</ol>
</xsl:template>
</xsl:stylesheet>
この変換は、(使用しない)任意のXML文書に適用された場合、指名手配、正しい結果が生成されます
:<ol>
<li> line1</li>
<li> line 2 -- foo</li>
<li> line 3</li>
</ol>
ノートを実行します。
XSLT 2.0関数を使用するunparsed-text()
任意のテキストファイルを文字列として処理し、上記のコードを使用して行に変換します。
tokenize(unparsed-text($vSomeUrl), '\r?\n')[normalize-space()]
残念ながらXSLT 1には効率的な文字列処理と解析機能がないため、このようなタスクにはあまり適していません(でも可能ですが)。
XSLT 2ではこれが変更されました。たとえばthis paper on XSLT 2 text parsingを参照してください。
I. XSLT 1.0溶液:
それは徹底的に聞こえる。ありがとう:) – bitmask
@bitmask:実際には、この処理はXSLT 1.0でも難しくありません。 –
XSL 1つのオーデルのXSL 2:
より正確には、我々はこのようなものを使用するのでしょうか? – Lucero
@Lucero:今は '1'を使っていますが、' 2'でもうまくいけばうまくいくでしょう。ですから、基本的には問題ではありません。 – bitmask