2016-12-19 2 views
0

으로 바꿉니다. 하나의 노드에 여러 단락이있는 텍스트 묶음이있는 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> 태그로 줄 바꿈합니다.

좀 더이에 나는 한 단계 더 갈 것 찾고이 XSLT OK

<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

을보십시오. 내 프로세스에는 노드 <row>을 하나의 XML 파일로 분할하는 XSLT가 포함됩니다. 이 작은 XML 파일에서 tokenize 함수를 실행하는 것이 더 쉬울 것입니다.

하지만이 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> 

XML 노드는 다음과 같습니다

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

그런 다음 우리는 마지막 단락이있다. 당신이 보는대로

그래서 어떻게 어떤 도움 col name="Model descr.">

감사 한 노드를 선택 할, 내 XSLT 경험이 제한됩니다.

또한 '해야 할 수도 있습니다