문자열을 토큰 화 한 다음 각 토큰에 analyze-string
을 실행해야합니다. 그러나 이것은 불가능 보인다XSL analyze-string 토큰 화 된 문자열의 어려움
: 축 아동에 대한 컨텍스트 항목의 필수 항목 유형 노드()이며, 제공된 값이 항목 유형은 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
을 노드가 아닌 토큰에 사용할 수있는 해결 방법을 알려주세요.
미리 감사드립니다.
오류 메시지가 잘못 표시되었습니다. [xsl : analyze-string' 명령은 입력으로 문자열을 취합니다] (https://www.w3.org/TR/xslt20/#analyze-string). 진짜 문제는 정규 표현식에 있습니다. –