2016-12-19 13 views
0

に置き換えます。1つのノードにいくつかの段落を含む一連のテキストがあるXMLがあります。私は\ nを</p><p>に置き換える必要があります。すべてのテキストセクションは、開始時に<p>、最後にXSLT定義の</p>となります。XSLTで nを</p><p>

は、私はこれを試してみましたが、それはサクソンに私にエラーを与える:変数find_allが宣言されていない(またはその宣言が有効範囲ではありません)

<xsl:template match="/csv/row/col[17]"> 
    <xsl:param name="find_all"> 
     <xsl:value-of select="."/> 
    </xsl:param> 
    <xsl:param name="find_return"> 
     <xsl:text>(.*)\n(.*)</xsl:text> 
    </xsl:param> 
    <xsl:param name="replace_return"> 
     <xsl:text>$1&lt;/p&gt;&lt;p&gt;$2</xsl:text> 
    </xsl:param> 
</xsl:template> 

そして、この後:

<col name="Model descr."> 
    <content> 
     <xsl:text>&lt;p&gt;</xsl:text> 
    </content> 
    <content> 
     <xsl:value-of select="replace($find_all, $find_return, $replace_return)"/> 
    </content> 
    <content> 
     <xsl:text>&lt;/p&gt;</xsl:text> 
    </content> 
</col> 

何が間違っていますか?

おかげ

答えて

1

あなたがここに間違ったアプローチを取っています。まず、あなたが私たちに示したスニペットから、パラメータを持つテンプレートがありますが、それらのパラメータはそのテンプレートの範囲内にローカルです。これらのパラメータをテンプレート外で使用しようとすると、それらのパラメータにアクセスできなくなります。

さらに、replace関数は文字列で機能し、<p>のような新しい要素の作成には使用できません。出力で作成するものは、エスケープされた値&lt;p&gt;です。

別の方法として、tokenize関数を使用して、改行に基づいてテキストを分割し、各項目を繰り返し、新しい<p>タグで折り返します。

もう少しこれにして、私はさらに一歩を行く探して

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

    <xsl:template match="text()" priority="2"> 
     <xsl:for-each select="tokenize(., '\n')[normalize-space()]"> 
      <p> 
       <xsl:value-of select="." /> 
      </p>    
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

ます。また 'ます。を必要とすることがあります。'があった場合 'p'タグの二つのレベルを避けるために既存のマークアップされた段落です。 –

+0

これは私にとってはうまくいくかどうかはわかりません。私が働いているのは、XMLを受け取り、それをHMTLを作成するプロセッサに送り、HTMLからPDFを出力するシステムです。私のXMLの各ノードは、PDFになるHTMLテンプレートと組み合わされたJavsScriptの変数です。 HTMLテンプレートでは、この変数のDIVタグとPタグが既にあります。私の問題は、長いテキストに改行が含まれている場合です。開始段落のタグはすでに配置されているので、改行を改行してPを終了し、新しい開始Pを、私のポストのタイトルを参照してください。 –

0

OKこのXSLTを試してみてください。私のプロセスにはノード<row>を1つのXMLファイルに分割するXSLTが含まれています。この小さなXMLファイルでtokenize関数を実行する方が簡単になります。

しかし、私はこのXMLのノードのちょうどのところでテキストをトークン化したいだけです。どのようにしてそれを選択すればいいですか?

<col name="Model descr.">Some text in first paragraph. 
More text in second paragraph. 
And then a third paragraph with more text. 

その後、我々は最後の段落を持っている:XMLノードは次のようになります

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="/excel-row/col"> 
    <xsl:apply-templates/> 
</xsl:template> 
<xsl:template match="text()"> 
    <xsl:for-each select="tokenize(.,'\n')"> 
     <xsl:sequence select="."/> 
     <xsl:if test="not(position() eq last())"> 
      <br /> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

:私はこれを見つけました。

どのように私は任意の助けのためのノードcol name="Model descr.">

感謝を選択するかあなたが見るように、私のXSLTの経験は限られています。

関連する問題