вставка <br>не будет работать на этой строке в xsl - PullRequest
0 голосов
/ 26 мая 2011

Я пытаюсь использовать следующий код для удаления тега форматированного текста "/ par" и замены его на <br/>. Код прекрасно работает для удаления "/ par", но по какой-то причине <BR/> не вставлен. Я попытался заменить <BR/> на **** (просто обычный текст), и это было вставлено просто отлично. Проблема в шаблоне "break" внизу.

<?xml version='1.0'?>

<xsl:template match="ProjectDataSet">
  <html>
    <body>
      <xsl:for-each select="Project">
        <H2>
          <xsl:value-of select ="@ProjectID"/>
        </H2>
        <H3>Information</H3>
        Userfield1: <xsl:value-of select="UserField1"/>
        Userfield2: <xsl:value-of select="UserField2"/>
        <H3>Milestones</H3>
        <xsl:for-each select="MilestoneItem">
          Date: <xsl:value-of select="Date"/>  Event: <xsl:value-of select="Event"/><BR/>
        </xsl:for-each>
        <H3>Comments</H3>
        <xsl:for-each select="CommentItem">
          Date: <xsl:value-of select="Date"/><BR/>
          Description<BR/>
          <xsl:call-template name="ConvertRTF">
            <xsl:with-param name="desc" select="Description"/>
          </xsl:call-template>
          <HR/>
        </xsl:for-each>
      </xsl:for-each>
    </body>
  </html>
</xsl:template>

<xsl:template name="ConvertRTF">
  <xsl:param name="desc"/>
  <xsl:variable name="header1">
      <!--remove rtf header part 1-->
      <xsl:call-template name="string-replace-all">
        <xsl:with-param name="oldtext" select="$desc"/>
        <xsl:with-param name="replace" select="'{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}'"/>
        <xsl:with-param name="by" select="''"/>
      </xsl:call-template>
    </xsl:variable>
  <xsl:variable name="header2">
      <!--remove rtf header part 2-->
      <xsl:call-template name="string-replace-all">
        <xsl:with-param name="oldtext" select="$header1"/>
        <xsl:with-param name="replace" select="'\viewkind4\uc1\pard\f0\fs17'"/>
        <xsl:with-param name="by" select="''"/>
      </xsl:call-template>
    </xsl:variable>
  <xsl:variable name="par">
    <!--place rtf /par with html <br> ******check this-->
    <xsl:call-template name="break">
      <xsl:with-param name="thetext" select="$header2"/>
    </xsl:call-template>
  </xsl:variable>
  <!--remove final } and output value-->
  <xsl:variable name="s_length" select="string-length($par)-2"/>
  <xsl:value-of select="substring($par,1,$s_length)"/>
</xsl:template>

<xsl:template name="string-replace-all">
  <xsl:param name="oldtext" />
  <xsl:param name="replace" />
  <xsl:param name="by" />
  <xsl:choose>
    <xsl:when test="contains($oldtext, $replace)">
      <xsl:value-of select="substring-before($oldtext,$replace)" />
      <xsl:value-of select="$by" />
      <xsl:call-template name="string-replace-all">
        <xsl:with-param name="oldtext" select="substring-after($oldtext,$replace)" />
        <xsl:with-param name="replace" select="$replace" />
        <xsl:with-param name="by" select="$by" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$oldtext" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="break">
  <xsl:param name="thetext"/>
  <xsl:choose>
    <xsl:when test="contains($thetext,'\par')">
      <xsl:value-of select="substring-before($thetext,'\par')"/>
      <BR/>
      <xsl:call-template name="break">
        <xsl:with-param name="thetext" select="substring-after($thetext,'\par')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$thetext"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Есть какие-нибудь подсказки, почему это не работает?

Ответы [ 3 ]

1 голос
/ 16 июня 2011

Я думаю, что у меня была та же проблема (вот почему я на этой странице атм). Ваша проблема заключается в коде, где вы выводите все это:

<xsl:value-of select="substring($par,1,$s_length)"/>

попробуйте использовать:

<xsl:copy-of select="substring($par,1,$s_length)"/>

«xsl: value-of» возвращает только text () элементов в выбранных тегах, в то время как «xsl: copy-of» возвращает все элементов (включая текст) ()) выбранного тега (ов).

Это фактически означает, что «xsl: value-of» просто удаляет «
» (элемент xml), но не «****» (элемент text ().

0 голосов
/ 26 мая 2011

<BR/> не является допустимым элементом в xsl.

вам нужно будет определить шаблон, а затем включить этот шаблон в xsl

в вашем шаблоне

<xsl:template name="Newline"><xsl:text>
</xsl:text></xsl:template>

в вашем xslt

<xsl:value-of select="substring-before($thetext,'\par')"/>
<xsl:call-template name="Newline" />
<xsl:call-template name="break">
...
0 голосов
/ 26 мая 2011

измените <br/> на <xhtml:br/>, чтобы сообщить xsl, что br не является элементом xml, но должно фактически отображаться в результате.

[править]

Это может сработать, только если вы на самом деле конвертируете в xhtml. : -О

...