代码之家  ›  专栏  ›  技术社区  ›  wsalesky

XSLT使用正则表达式进行标记,仅当分号后面没有空格和数字时才进行标记

  •  2
  • wsalesky  · 技术社区  · 1 年前

    我试图对这个字符串进行标记,为每个书目引用创建单独的条目。问题是,有时分号分隔书目条目,有时分隔页码。我想编写标记器,只在分号后面没有空格和数字的情况下进行标记。我下面有一些作品,但它剪掉了每篇引文的第一个字母。(我使用XSLT 2.0)

    输入:

      <zotero>(Leppin 2019; Francisco 2011, 119; van Ginkel 2005, 43–44; 1995, 114–115; 126; 147; 166–67)</zotero>
    

    XSLT:

    <xsl:for-each select="tokenize(zotero,';\s[^\d]')">
     <bibl><xsl:value-of select="."/></bibl>
    </xsl:for-each>
    

    电流输出:

    <bibl>(Leppin 2019</bibl>
    <bibl>rancisco 2011, 119</bibl>
    <bibl>an Ginkel 2005, 43–44; 1995, 114–115; 126; 147; 166–67)</bibl>
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   michael.hor257k    1 年前

    不幸的是,XPath规范不允许在正则表达式中进行前瞻。

    您可以使用以下解决方法:

    <xsl:variable name="preprocess" select="replace(zotero, ';\s(\D)', '&#133;$1')" />
    <xsl:for-each select="tokenize($preprocess, '&#133;')">
        <bibl>
            <xsl:value-of select="."/>
        </bibl>
    </xsl:for-each>
    

    或者,如果你使用的是Saxon处理器,你可以切换到标准的Java正则表达式引擎,并简单地执行以下操作:

    <xsl:for-each select="tokenize(zotero, ';\s(?=\D)', ';j')">
    
        2
  •  1
  •   Martin Honnen    1 年前

    我想编写标记器,只在分号为 后面没有空格和数字

    展望未来,这将表现为

      <xsl:template match="zotero">
        <xsl:for-each select="tokenize(., ';(?! [0-9])', ';j')">
          <bib>{.}</bib>
        </xsl:for-each>
      </xsl:template>
    

    那个 ;j 旗帜适用于撒克逊Java、撒克逊C、撒克逊。NET、SaxonCS和SaxonJS从标准XPath正则表达式切换到支持的平台。