2012-07-16 3 views
0

XML을 HTML로 변환하는 스타일 시트에서 XSLT 2.0 요소 analyze-string을 사용합니다. 특히, 화학 공식의 첨자에 대한 문자열 인코딩을 HTML 첨자로 변환하는 데 사용합니다. 따라서 결과는 p 또는 td 요소에 삽입 된 마크 업과 함께 표시되는 문자열입니다.XSLT 2.0을 사용하여 줄 바꿈을 제거합니다. analyze-string

변환이 2 O하지만 사실 H 같은 출력을 생성하도록되어는 HTML에서 선 파쇄 삽입 :

H 
<sub>2</sub>O 

를이 틈 공간으로서 브라우저에 의해 해석 (정확하게) 인 :

추한 H 2 O

.

줄 바꿈을 제거 할 수있는 방법이 있습니까? 전체 분석 문자열 요소를 한 줄에 넣으려고했는데 작동하지 않습니다.

입력은 더-복잡 하나

<OrdinaryStructralFormula>H$_2$O</OrdinaryStructuralFormula> 
간단한 경우에 대한

<OrdinaryStructralFormula>C$_2$OH$_5$$^-</OrdinaryStructuralFormula> 

같은 것입니다. 첨자 패턴은 일반적인 경우 여러 번 일치 할 수 있으며 문자열의 중간이나 끝에있을 수 있습니다. 이 패턴은 또한 두 번째 예제의 끝에 $^- bit라는 충전 표기법과 일치해야합니다.

XSLT 프로세서는 Saxon 9.4이고 XSLT 템플릿은 다음과 같습니다.

<xsl:template name="formula"> 
    <xsl:param name="formula"/> 
    <xsl:if test="$formula"> 
    <xsl:variable name="f" select="translate($formula, '$', '')"/> 
    <xsl:analyze-string select="$f" regex="(_)(\d+)|(\^)\d*\+|(\^)\d*\-"> 
     <xsl:matching-substring> 
     <xsl:if test="regex-group(1)='_'"> 
      <sub><xsl:value-of select="regex-group(2)"/></sub> 
     </xsl:if> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
     <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
    </xsl:if> 
</xsl:template> 
+1

입력 XML, XSLT 코드, 원하는 결과물, 현재 출력물을 완벽하고 최소이지만 잘 작성한 샘플을 게시하여 문제를 설명하고이를 재현 할 수 있도록하십시오. 혐의 된 입력이' H $ _2 $ O'인데, 시작 태그 이름이 끝 태그 이름과 다른 경우, 당신이 얻는 공백의 원인이 무엇인지 알 수 없으며, 당신이 게시 한 XSLT 스 니펫에는 아무것도 설명되어 있지 않습니다. –

답변

0

내가보고 된 결과을 재현 할 수 없습니다.

이 변환 (당신이 우리에게 준해야하지만, 당신은 단지 템플릿을 제공하는 것입니다) :

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

    <xsl:template match="/"> 
    <xsl:call-template name="formula"> 
     <xsl:with-param name="formula" select="/*"/> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="formula"> 
     <xsl:param name="formula"/> 

     <xsl:if test="$formula"> 
     <xsl:variable name="f" select="translate($formula, '$', '')"/> 
     <xsl:analyze-string select="$f" regex="(_)(\d+)|(\^)\d*\+|(\^)\d*\-"> 
      <xsl:matching-substring> 
      <xsl:if test="regex-group(1)='_'"> 
       <sub><xsl:value-of select="regex-group(2)"/></sub> 
      </xsl:if> 
      </xsl:matching-substring> 
      <xsl:non-matching-substring> 
      <xsl:value-of select="."/> 
      </xsl:non-matching-substring> 
     </xsl:analyze-string> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

색슨 9.1.05로 다음과 같은 XML 문서에 적용 할 때 :

:
<formula>H$_2$O</formula> 

이 원하는, 올바른 결과을 생산

H<sub>2</sub>O 

같은 변환이 두 번째 XML 문서에 적용되는 경우 : 다시 원하는 정확한 결과가 생성됩니다

<OrdinaryStructuralFormula>C$_2$OH$_5$$^-</OrdinaryStructuralFormula> 

:

C<sub>2</sub>OH<sub>5</sub> 

주의 마 : 나는 달렸다 두 개의 다른 XSLT 2와 동일한 변환.0 프로세서 : XQSharp (XMLPrime) 및 AltovaXML (XML-SPY)과 똑같은 결과를 얻었습니다.

관련 문제