2009-12-08 6 views
1

bbcode를 html로 변환 할 수있는 실행 가능한 솔루션을 찾는 데 도움이 필요합니다. 여기서는 ive가 지금까지 왔지만 bbcodes가 줄 바꿈 될 때 실패합니다.xslt 2.0으로 BBCode 구문 분석

의 Src :

[quote id="ohoh81"]asdasda 
    [quote id="ohoh80"]adsad 
     [quote id="ohoh79"]asdad[/quote] 
    [/quote] 
[/quote] 

코드 : XSLT 잘 구성된 XML이 아닌 임의의 텍스트를 처리 할 수 ​​있도록 설계되어 있기 때문에

<xsl:variable name="rules"> 
    <code check="&#xD;" >&lt;br/&gt;</code> 
    <code check="\&#91;(quote)(.*)\&#93;" >&lt;span class=&#34;quote&#34;&gt;</code> 
</xsl:variable> 

<xsl:template match="text()" mode="BBCODE"> 
    <xsl:call-template name="REPLACE_EM_ALL"> 
    <xsl:with-param name="text" select="." /> 
    <xsl:with-param name="pos" select="number(1)" /> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="REPLACE_EM_ALL"> 
    <xsl:param name="text" /> 
    <xsl:param name="pos" /> 
    <xsl:variable name="newText" select="replace($text, ($rules/code[$pos]/@check), ($rules/code[$pos]))" /> 
    <xsl:choose> 
    <xsl:when test="$rules/code[$pos +1]"> 
     <xsl:call-template name="REPLACE_EM_ALL"> 
     <xsl:with-param name="text" select="$newText" /> 
     <xsl:with-param name="pos" select="$pos+1" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of disable-output-escaping="yes" select="$newText" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

답변

2

일치하는 항목이 없을 때까지 반복적으로 일치시키고 (정규식을 통해) 쌍의 BBcode 태그를 반복적으로 대치하고 대체하는 것이 더 실용적인 접근 방식이라고 생각합니다. 예 : [quote][url]을 위해 : 비 XML 텍스트의 처리를 위해 꽤 굉장 분석 - 텍스트 '명령 :

<xsl:function name="my:bbcode-to-xhtml" as="node()*"> 
    <xsl:param name="bbcode" as="xs:string"/> 
    <xsl:analyze-string select="$bbcode" regex="(\[quote\](.*)\[/quote\])|(\[url=(.*?)\](.*)\[/url\])" flags="s"> 
    <xsl:matching-substring> 
     <xsl:choose> 
     <xsl:when test="regex-group(1)"> <!-- [quote] --> 
      <span class="quote"> 
      <xsl:value-of select="my:bbcode-to-xhtml(regex-group(2))"/> 
      </span> 
     </xsl:when> 
     <xsl:when test="regex-group(3)"> <!-- [url] --> 
      <a href="regex-group(4)"> 
      <xsl:value-of select="my:bbcode-to-xhtml(regex-group(5))"/> 
      </a> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:matching-substring> 
    <xsl:non-matching-substring> 
     <xsl:value-of select="."/> 
    </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:function> 
+0

구조화 된 언어를 구문 분석하기 위해 정규 표현식을 사용하지 않는 것이 일반적으로 여기 있다고 생각했습니다. ;) – Tomalak

+0

실제로는 두 번만 일치하므로 잘 될 것입니다. Thanx again Pavel – Sveisvei

+0

regex-group은 위의 regex를 가진 regex-group (1)이어야합니다. 생산성 btw에서 작동합니다. – Sveisvei

1

이 아마 나쁜 생각이다. 왼쪽 및 오른쪽 대괄호를 <>으로 바꾸려면 먼저 BBCode를 전처리 한 다음 올바른 형식의 XML을 만들고 XSL로 처리해야합니다.

+1

XSLT 2.0은'XSL있다. –

+1

사실, 아직 완전한 비 XML 입력 파일을 처리하기위한 것은 아닙니다. XSL에서 모든 BBCode에 대한 일반적인 파서가 매우 복잡하고 유지하기가 어려울 것이기 때문에 분명히 XSLT에서이 작업을 수행하려고하지는 않을 것입니다. BBCode는 XML 구조에 충분히 가깝기 때문에 XML로 표현하고 XSLT의 모든 기능을 사용하여 XHTML로 변환하는 것이 훨씬 쉬울 것입니다. –

+0

@ 짐 : +1. XSLT는 XML 변환을위한 훌륭한 도구입니다. 다용도 언어가 아닙니다 ... – Erlock