Frage

Wie kann ich eine Zeichenfolge der Wortanzahl in XSLT begrenzen 1.0?

War es hilfreich?

Lösung

Wie wäre es so etwas wie:

  <xsl:template match="data"> <!-- your data element or whatever -->
    <xsl:call-template name="firstWords">
      <xsl:with-param name="value" select="."/>
      <xsl:with-param name="count" select="4"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="firstWords">
    <xsl:param name="value"/>
    <xsl:param name="count"/>

    <xsl:if test="number($count) >= 1">
      <xsl:value-of select="concat(substring-before($value,' '),' ')"/>
    </xsl:if>
    <xsl:if test="number($count) > 1">
      <xsl:variable name="remaining" select="substring-after($value,' ')"/>
      <xsl:if test="string-length($remaining) > 0">
        <xsl:call-template name="firstWords">
          <xsl:with-param name="value" select="$remaining"/>
          <xsl:with-param name="count" select="number($count)-1"/>
        </xsl:call-template>
      </xsl:if>
    </xsl:if>
  </xsl:template>

Andere Tipps

Dies ist eine XSLT 1.0-Lösung :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
>

   <xsl:import href="strSplit-to-Words.xsl"/>

   <xsl:output indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/">
      <xsl:variable name="vwordNodes">
        <xsl:call-template name="str-split-to-words">
          <xsl:with-param name="pStr" select="/"/>
          <xsl:with-param name="pDelimiters" 
                          select="', &#9;&#10;&#13;()-'"/>
        </xsl:call-template>
      </xsl:variable>

      <xsl:call-template name="strTakeWords">
        <xsl:with-param name="pN" select="10"/>
        <xsl:with-param name="pText" select="/*"/>
        <xsl:with-param name="pWords"
             select="ext:node-set($vwordNodes)/*"/>
      </xsl:call-template>
    </xsl:template>

    <xsl:template match="word" priority="10">
      <xsl:value-of select="concat(position(), ' ', ., '&#10;')"/>
    </xsl:template>

    <xsl:template name="strTakeWords">
      <xsl:param name="pN" select="10"/>
      <xsl:param name="pText"/>
      <xsl:param name="pWords"/>
      <xsl:param name="pResult"/>

      <xsl:choose>
          <xsl:when test="not($pN > 0)">
            <xsl:value-of select="$pResult"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:variable name="vWord" select="$pWords[1]"/>
            <xsl:variable name="vprecDelims" select=
               "substring-before($pText,$pWords[1])"/>

            <xsl:variable name="vnewText" select=
                "concat($vprecDelims, $vWord)"/>

              <xsl:call-template name="strTakeWords">
                <xsl:with-param name="pN" select="$pN -1"/>
                <xsl:with-param name="pText" select=
                      "substring-after($pText, $vnewText)"/>
                <xsl:with-param name="pWords" select=
                     "$pWords[position() > 1]"/>
                <xsl:with-param name="pResult" select=
                 "concat($pResult, $vnewText)"/>
              </xsl:call-template>
          </xsl:otherwise>
      </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

, wenn diese Transformation auf das folgende XML-Dokument angewendet wird:

<t>
(CNN) -- Behind closed doors in recent days,
senior White House aides have been saying that
measuring President Obama's first 100 days
is the journalistic equivalent of a Hallmark holiday.
</t>

das gewünschte Ergebnis zurückgegeben :

(CNN) -- Behind closed doors in recent days, senior White House

Hinweis: :

  1. Die str-split-to-words Vorlage aus FXSL verwendet wird, für tokenization.

  2. Diese Vorlage akzeptiert einen Parameter pDelimiters, die eine Zeichenfolge ist, die aus allen Zeichen, die als Trennzeichen behandelt werden sollen. So im Gegensatz zu anderen Lösungen ist es möglich, jedes Trennzeichen (und nicht nur einen "Raum") angeben -. In diesem Fall von denen 8

  3. Die benannte Vorlage strTakeWords ruft sich selbst rekursiv den Text vor zu akkumulieren und jedes Wort aus der Wortliste , einschließlich der tokenization erzeugt, bis die angegebene Anzahl von Wörtern verarbeitet worden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top