2016-12-02 5 views
2

문자열을 토큰 화 한 다음 각 토큰에 analyze-string을 실행해야합니다. 그러나 이것은 불가능 보인다XSL analyze-string 토큰 화 된 문자열의 어려움

"XPTY0020

: 축 아동에 대한 컨텍스트 항목의 필수 항목 유형 노드()이며, 제공된 값이 항목 유형은 xs 있습니다 문자열) 때문에 분석 문자열 노드를 필요가 문맥".

analyze-string은 문자열을 분석해야하기 때문에 제게 미치겠습니다. 그래서이 문제를 해결하는 방법을 모르겠습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<rows> 
    <row> 
     <field name="def">1) ἀλλά sed, vero 2) καί et 3) а cum condicionali iunctum aequiparat 
      аште: 4) ἵνα ut chron.</field> 
    </row> 
    <row> 
     <field name="def">ἡλοῦν clavo figere</field> 
    </row> 
</rows> 

내 스타일은 다음과 같습니다 :

내 (간체) XML은 다음과 같습니다 analyze-string의 문제없이

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output omit-xml-declaration="no" indent="yes"/> 

    <xsl:template match="field[@name = 'def']"> 
     <entry> 
      <xsl:call-template name="sense"> 
       <xsl:with-param name="def" select="."/> 
      </xsl:call-template> 
     </entry> 
    </xsl:template> 

    <xsl:template name="sense"> 
     <xsl:param name="def"/> 
     <xsl:param name="separator" select="'\d{1,2}\)\s'"/> 

     <xsl:for-each select="tokenize(normalize-space($def), $separator)"> 
      <xsl:if test="string-length(.) > 0"> 
       <xsl:element name="sense"> 
        <xsl:attribute name="n"> 
         <xsl:value-of select="position() - 1"/> 
        </xsl:attribute> 
        <!--this is the problematic bit, because current() is 
        a string here -\- and, paradoxically, analyze-string 
        cannot deal with it--> 
        <xsl:analyze-string select="current()" 
         regex="^([\p{IsGreek}\p{IsGreekExtended}]+[\s]*[\p{IsGreek}\p{IsGreekExtended}]*)(.*$)"> 
         <xsl:matching-substring> 
          <greek> 
           <xsl:value-of select="regex-group(1)"/> 
           <xsl:value-of select="regex-group(2)"/> 
          </greek> 
         </xsl:matching-substring> 
         <xsl:non-matching-substring> 
          <xsl:value-of select="current()"/> 
         </xsl:non-matching-substring> 
        </xsl:analyze-string> 
       </xsl:element> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

, 정확하게 다음과 같은 출력을 생성 위의 스타일 :

<?xml version="1.0" encoding="UTF-8"?> 
<entry xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <sense n="1">ἀλλά sed, vero </sense> 
    <sense n="2">καί et </sense> 
    <sense n="3">а cum condicionali iunctum aequiparat аште: </sense> 
    <sense n="4">ἵνα ut chron.</sense> 
</entry> 
<entry xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <sense n="0">ἡλοῦν clavo figere</sense> 
</entry> 

스타일 시트는 tokenize() 방법을 사용하여 여러 개의 감각을 분리합니다. 그런 다음 각각의 식별 된 감각에 대해 <greek></greek>으로 첫 번째 그리스 단어를 감싸기 위해 analyze-string을 사용하고 싶습니다.

analyze-string을 노드가 아닌 토큰에 사용할 수있는 해결 방법을 알려주세요.

미리 감사드립니다.

+0

오류 메시지가 잘못 표시되었습니다. [xsl : analyze-string' 명령은 입력으로 문자열을 취합니다] (https://www.w3.org/TR/xslt20/#analyze-string). 진짜 문제는 정규 표현식에 있습니다. –

답변

3

나는 당신의 중괄호가

regex="^([\p{{IsGreek}}\p{{IsGreekExtended}}]+[\s]*[\p{{IsGreek}}\p{{IsGreekExtended}}]*)(.*$)" 

말을 배가 할 필요가 있으므로 문제가 regex 속성은 속성 값 템플릿을 수 있다는 생각 또는 당신은 변수, 예를 들어 외부 패턴을 정의 할 필요가

<xsl:variable name="pattern">^([\p{IsGreek}\p{IsGreekExtended}]+[\s]*[\p{IsGreek}\p{IsGreekExtended}]*)(.*$)</xsl:variable> 

regex="{$pattern}"을 사용하십시오.

+0

좀 더 구체적으로 말하자면, 프로세서는 {{IsGreek}'을 보았고 중괄호 안에있는 텍스트를 XPath 식으로 해석하고 'child :: IsGreek'을 의미한다고 결정한 다음'child :: IsGreek'은 컨텍스트 항목이 문자열 일 때 의미가 없습니다. –

+0

@MichaelKay 여기에 오류를 설명해 주시겠습니까 : http://xsltransform.net/jz1PuPo –

+0

@ michael.hor257k, 유니 코드 클래스와 관련된 일부 파일을로드 할 수 없다는 경고와 함께 비슷한 오류 메시지가 나타납니다. Saxon의 특정 설치 및 구성과 관련된 문제가 있습니다. oXygen 내부의 Saxon 9.6 및 명령 행에서 Saxon 9.7 HE를 사용하여 코드를 잘 실행할 수 있습니다. –