带有标记化字符串的XSL分析字符串难度

问题描述:

我需要标记字符串,然后在每个标记上运行analyze-string。然而,这似乎是不可能的:带有标记化字符串的XSL分析字符串难度

“XPTY0020:所需项类型为子轴 上下文项的是节点();提供的值具有项目类型的xs:串),因为 分析串需要一个节点语境”。

这使我疯了,因为analyze-string应该,分析字符串,所以我不明白如何解决这个问题。

我(简化)XML看起来是这样的:

<?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 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> 

没有问题的analyze-string,上面的样式将正确生成以下的输出:

<?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()方法来分离多个感官。然后,对于每个已识别的感官,我想用analyze-string将第一个希腊语单词用<greek></greek>包起来。

我可以使用什么解决方法使analyze-string对令牌(即字符串)而不是节点起作用?

非常感谢提前!

+0

错误消息有误导性。 ['xsl:analyze-string'指令以字符串形式输入](https://www.w3.org/TR/xslt20/#analyze-string)。真正的问题在于你的正则表达式。 –

我认为问题是,regex属性允许属性值模板,这样你的花括号需要加倍地说

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

,或者您需要一个变量例如外界定义图案

<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,我看到一个类似的错误消息,并伴随着一个警告,一些与Unicode类相关的文件无法加载,所以我认为萨克森的特殊安装和配置存在问题。我可以在oXygen内部使用Saxon 9.6以及从命令行使用Saxon 9.7 HE来运行该代码。 –