2012-04-07 10 views
2

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 

などのファイルを変換することができますか?

+0

XSL 1つのオーデルのXSL 2:

より正確には、我々はこのようなものを使用するのでしょうか? – Lucero

+0

@Lucero:今は '1'を使っていますが、' 2'でもうまくいけばうまくいくでしょう。ですから、基本的には問題ではありません。 – bitmask

答えて

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, '&#xA;'), '&#xA;')"/> 

     <li><xsl:value-of select="$vthisLine"/></li> 

     <xsl:call-template name="linesToLi"> 
     <xsl:with-param name="pText" select="substring-after($pText, '&#xA;')"/> 
     </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()] 
1

残念ながらXSLT 1には効率的な文字列処理と解析機能がないため、このようなタスクにはあまり適していません(でも可能ですが)。

XSLT 2ではこれが変更されました。たとえばthis paper on XSLT 2 text parsingを参照してください。

I. XSLT 1.0溶液

+0

それは徹底的に聞こえる。ありがとう:) – bitmask

+1

@bitmask:実際には、この処理はXSLT 1.0でも難しくありません。 –

関連する問題