0

我有一个 XML 行,其中有一个很长的句子,例如:

    <ROW>4.)Whatever universe a professor believes in must at any rate be a universe that lends itself to lengthy discourse. A universe definable in two sentences is something for which the professorial intellect has no use. No faith in anything of that cheap kind!

我需要将句子分成更小的句子并在 Altova Stylevision 中以多行显示。

我正在使用 Autocalc 动态显示行中的内容。是否有任何 Xpath 表达式可用于根据每行中的字数或字符数将行拆分为多行。以便我可以将行显示为:

    Whatever universe a professor believes in must at any rate
    be a universe that lends itself to lengthy discourse.

等等。

4

1 回答 1

0

您似乎正试图将您的字符串输入分成多个部分(单词/字符串长度)。我为您创建了一个示例,以使其变得容易。请通过并检查它是否可以帮助您:

输入xml

<?xml version="1.0" encoding="UTF-8"?>
<ROW>4.)Whatever universe a professor believes in must at any rate be a universe that lends itself to lengthy discourse. A universe definable in two sentences is something for which the professorial intellect has no use. No faith in anything of that cheap kind!11</ROW>

XSLT

<?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" exclude-result-prefixes="xs" version="2.0">

  <xsl:output indent="yes" method="xml"/>
  <xsl:template match="ROW">
    <output>
    <xsl:variable name="Length" select="string-length(.)"/>
    <xsl:variable name="Words" select="count(tokenize(.,'\s'))"/>
    <xsl:variable name="ByLength" select="50"/>
    <xsl:variable name="ByWord" select="5"/>
    <!-- To get ouput by words -->
      <xsl:if test="$ByWord">
        <xsl:variable name="Result">
            <xsl:call-template name="GetBreakingWords">
              <xsl:with-param name="Value" select="."/>
              <xsl:with-param name="ByWord" select="$ByWord"/>
              <xsl:with-param name="Words" select="$Words"/>
          </xsl:call-template>
        </xsl:variable>
        <p>By word example</p>
        <xsl:for-each select="$Result/row">
          <xsl:sort select="@id" data-type="number"/>
          <!--<row><xsl:value-of select="."/></row>-->
          <xsl:copy-of select="."/>
        </xsl:for-each>
      </xsl:if>
      <!-- To get ouput by string length -->
      <xsl:if test="$ByLength">
        <xsl:variable name="Result">
          <xsl:call-template name="GetBreakingStrings">
            <xsl:with-param name="Value" select="."/>
            <xsl:with-param name="ByLength" select="$ByLength"/>
            <xsl:with-param name="Length" select="$Length"/>
          </xsl:call-template>
        </xsl:variable>
        <p>By String example</p>
        <xsl:for-each select="$Result/row">
          <xsl:sort select="@id" data-type="number"/>
          <!--<row><xsl:value-of select="."/></row>-->
          <xsl:copy-of select="."/>
        </xsl:for-each>
      </xsl:if>

    </output>
  </xsl:template>

  <xsl:template name="GetBreakingWords">
    <xsl:param name="ByWord"/>
    <xsl:param name="Value"/>
    <xsl:param name="Words"/>
    <xsl:param name="counter" select="1"/>
    <xsl:choose>
      <xsl:when test="($Words gt $ByWord)">
      <xsl:variable name="CurrentRow" select="normalize-space(string-join(for $x in tokenize($Value, '\s')[position() ge 1 and position() le $ByWord] return $x, ' '))"/>
      <xsl:call-template name="GetBreakingWords">
        <xsl:with-param name="ByWord" select="$ByWord"/>
        <xsl:with-param name="Words" select="count(tokenize(substring-after($Value, $CurrentRow),'\s'))"/>
        <xsl:with-param name="Value" select="substring-after($Value, $CurrentRow)"/>
        <xsl:with-param name="counter" select="sum($counter + 1)"></xsl:with-param>
      </xsl:call-template>
        <row id="{$counter}"><xsl:value-of select="$CurrentRow"/></row>
      </xsl:when>
      <xsl:when test="not($Words gt $ByWord) and $Value">
        <row id="{$counter}"><xsl:value-of select="$Value"/></row>
      </xsl:when>
      </xsl:choose>
  </xsl:template>

  <xsl:template name="GetBreakingStrings">
    <xsl:param name="ByLength"/>
    <xsl:param name="Value"/>
    <xsl:param name="Length"/>
    <xsl:param name="counter" select="1"/>
    <xsl:choose>
      <xsl:when test="($Length gt $ByLength)">
        <xsl:variable name="CurrentRow" select="normalize-space(string-join(substring($Value,0,$ByLength),' '))"/>
        <xsl:call-template name="GetBreakingStrings">
          <xsl:with-param name="ByLength" select="$ByLength"/>
          <xsl:with-param name="Length" select="string-length(substring-after($Value, $CurrentRow))"/>
          <xsl:with-param name="Value" select="substring-after($Value, $CurrentRow)"/>
          <xsl:with-param name="counter" select="sum($counter + 1)"></xsl:with-param>
        </xsl:call-template>
        <row id="{$counter}"><xsl:value-of select="$CurrentRow"/></row>
      </xsl:when>
      <xsl:when test="not($Length gt $ByLength) and $Value">
        <row id="{$counter}"><xsl:value-of select="$Value"/></row>
      </xsl:when>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <p>By word example</p>
   <row id="1">4.)Whatever universe a professor believes</row>
   <row id="2">in must at any</row>
   <row id="3">rate be a universe</row>
   <row id="4">that lends itself to</row>
   <row id="5">lengthy discourse. A universe</row>
   <row id="6">definable in two sentences</row>
   <row id="7">is something for which</row>
   <row id="8">the professorial intellect has</row>
   <row id="9">no use. No faith</row>
   <row id="10">in anything of that</row>
   <row id="11"> cheap kind!11</row>
   <p>By String example</p>
   <row id="1">4.)Whatever universe a professor believes in must</row>
   <row id="2">at any rate be a universe that lends itself to l</row>
   <row id="3">engthy discourse. A universe definable in two sen</row>
   <row id="4">tences is something for which the professorial in</row>
   <row id="5">tellect has no use. No faith in anything of that</row>
   <row id="6"> cheap kind!11</row>
</output>
于 2014-09-18T10:47:16.947 回答