Удалите все отдельные символы из строки, используя xslt1.0 - PullRequest
1 голос
/ 01 февраля 2012
<title>
 <article_title>Land a b   c   d      Band</article_title>
</title>

с использованием следующей функции

replace(article_title, '(^[^ ]+)(.+\s+)([^ ]+)$', '$1 $3')

эта строка преобразуется в Land Band, и это именно то, что я хочу.

но проблема в том, что мне нужно это решение в xslt 1.0, так как Java-приложение, с которым я работаю, может обрабатывать только разбор xslt 1.0.

1 Ответ

1 голос
/ 01 февраля 2012

Это преобразование XSLT 1.0 (есть неприятная ошибка SO, и код не имеет отступов - я прошу прощения за этот визуальный беспорядок ...):

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

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()" name="removeSingles">
   <xsl:param name="pText" select="."/>

   <xsl:variable name="vText" select="normalize-space($pText)"/>

   <xsl:if test="string-length($vText)">
    <xsl:variable name="vLeftChars" select=
    "substring-before(concat($vText, ' '), ' ')"/>

    <xsl:if test="string-length($vLeftChars) >1">
     <xsl:value-of select="$vLeftChars"/>
     <xsl:if test=
      "not(string-length($vLeftChars)
          >=
           string-length($vText)
           )
      ">
       <xsl:text> </xsl:text>
      </xsl:if>
    </xsl:if>

    <xsl:call-template name="removeSingles">
     <xsl:with-param name="pText" select=
     "substring-after($vText, ' ')"/>
    </xsl:call-template>
   </xsl:if>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<title>
 <article_title>Land a b   c   d      Band</article_title>
</title>

дает желаемый, правильный результат :

<title>
   <article_title>Land Band</article_title>
</title>
...