Символ XSL выходит из проблемы

Я думаю, что это поможет. По существу, исправление округления вверх.

var nums = 1.12346;
    nums = MathRound(nums, 4);
    console.log(nums);

function MathRound(num, nrdecimals) {
    let n = num.toFixed(nrdecimals);
    return (n > num) ? n-(1/(Math.pow(10,nrdecimals))) : n;
}

8
задан jelovirt 17 March 2009 в 12:21
поделиться

3 ответа

Вы не должны хранить, вышел из HTML в Вашей базе данных. Если бы Ваша база данных содержала фактическое" <" символ, то команда "disable-output-escaping" сделала бы то, что Вы хотели.

Если Вы не можете изменить данные затем, необходимо будет не выйти из данных перед Вашим выполнять преобразование.

6
ответ дан 5 December 2019 в 06:10
поделиться

Базирующийся в предположении, что у Вас есть эта строка HTML,

<p>My name is Freddy &amp; I was

затем, если бы Вы выходите из него и храните его в базе данных, это стало бы этим:

&lt;p&gt;My name is Freddy &amp;amp; I was

Следовательно, при получении его как XML (не не выходя из него заранее), результат был бы этим:

&amp;lt;p&amp;gt;My name is Freddy &amp;amp;amp; I was

и <xsl:value-of select="." disable-output-escaping="yes" /> произвел бы:

&lt;p&gt;My name is Freddy &amp;amp; I was

Вы получаете точно то же самое, которое Вы имеете в своей базе данных, но конечно Вы видите HTML-тэги в выводе. Таким образом, то, в чем Вы нуждаетесь, является механизмом, который делает следующие строковые замены:

  • "&amp;lt;" с "&lt;" (эффективно изменение &lt; кому: < в незавершенном ouput)
  • "&amp;gt;" с "&gt;" (эффективно изменение &gt; кому: > в незавершенном ouput)
  • "&amp;quot;" с "&quot;" (эффективно изменение &quot; кому: " в незавершенном ouput)
  • "&amp;amp;" с "&amp;" (эффективно изменение &amp; кому: & в незавершенном ouput)

От Вашего XSL я вывел следующий тестовый входной XML:

<DocumentElement>
  <QueryResults>
    <Title>Article 1</Title>
    <ArticleId>1</ArticleId>
    <SEOTitle>Article_1</SEOTitle>
    <Summary>&amp;lt;p&amp;gt;Article 1 summary &amp;amp;amp; description.&amp;lt;/p&amp;gt;</Summary>
  </QueryResults>
  <QueryResults>
    <Title>Article 2</Title>
    <ArticleId>2</ArticleId>
    <SEOTitle>Article_2</SEOTitle>
    <Summary>&amp;lt;p&amp;gt;Article 2 summary &amp;amp;amp; description.&amp;lt;/p&amp;gt;</Summary>
  </QueryResults>
</DocumentElement>

Я изменил таблицу стилей, Вы предоставили и реализовали такой заменяющий механизм. Если Вы применяете следующий шаблон XSLT 1.0 к нему:

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:my="my:namespace"
  exclude-result-prefixes="my"
>

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

  <my:unescape>
    <my:char literal="&lt;" escaped="&amp;lt;" />
    <my:char literal="&gt;" escaped="&amp;gt;" />
    <my:char literal="&quot;" escaped="&amp;quot;" />
    <my:char literal="&amp;" escaped="&amp;amp;" />
  </my:unescape>

  <xsl:template match="DocumentElement">
    <div id="mySlides">
      <xsl:apply-templates mode="slides" />
    </div>
    <div id="myController">
      <xsl:apply-templates mode="controller" />
    </div>
  </xsl:template>

  <xsl:template match="DocumentElement/QueryResults" mode="slides">
    <div class="article">
      <h2>
        <a class="title" title="{Title}" href="{concat('/stories/stories-details/articletype/articleview/articleid/', ArticleId, '/', SEOTitle, '.aspx')}">
          <xsl:value-of select="Title"/>
        </a>
      </h2>
      <div class="articlesummary" style="text-indent: 25px;">
        <xsl:apply-templates select="document('')/*/my:unescape/my:char[1]">
          <xsl:with-param name="html" select="Summary" />
        </xsl:apply-templates>
      </div>
    </div>
  </xsl:template>

  <xsl:template match="DocumentElement/QueryResults" mode="controller">
    <span class="jFlowControl">
      <xsl:text>aa </xsl:text>
      <xsl:value-of select="Title" />
    </span>
  </xsl:template>

  <xsl:template match="my:char">
    <xsl:param name="html" />
    <xsl:variable name="intermediate">
      <xsl:choose>
        <xsl:when test="following-sibling::my:char">
          <xsl:apply-templates select="following-sibling::my:char[1]">
            <xsl:with-param name="html" select="$html" />
          </xsl:apply-templates>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$html" disable-output-escaping="yes" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:call-template name="unescape">
      <xsl:with-param name="html" select="$intermediate" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="unescape">
    <xsl:param name="html" />
    <xsl:choose>
      <xsl:when test="contains($html, @escaped)">
        <xsl:value-of select="substring-before($html, @escaped)" disable-output-escaping="yes"/>
        <xsl:value-of select="@literal" disable-output-escaping="yes" />
        <xsl:call-template name="unescape">
          <xsl:with-param name="html" select="substring-after($html, @escaped)"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$html" disable-output-escaping="yes"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

Затем этот вывод HTML производится:

<div id="mySlides">
  <div class="article">
    <h2>
      <a class="title" title="Article 1" href="/stories/stories-details/articletype/articleview/articleid/1/Article_1.aspx">Article 1</a>
    </h2>
    <div class="articlesummary" style="text-indent: 25px;">
      <p>Article 1 summary &amp; description.</p>
    </div>
  </div>
  <div class="article">
    <h2>
      <a class="title" title="Article 2" href="/stories/stories-details/articletype/articleview/articleid/2/Article_2.aspx">Article 2</a>
    </h2>
    <div class="articlesummary" style="text-indent: 25px;">
      <p>Article 2 summary &amp; description.</p>
    </div>
  </div>
</div>
<div id="myController">
  <span class="jFlowControl">aa Article 1</span>
  <span class="jFlowControl">aa Article 2</span>
</div>

Примечание:

  • использование временного пространства имен и встроенных элементов (<my:unescape>) создать список символов для замены
  • использование рекурсии для эмуляции повторяющейся замены всех затронутых символов во входе
  • использование неявного контекста в unescape обработайте по шаблону для переноса информации, какой символ должен быть заменен в данный момент

Кроме того, примечание:

  • использование шаблонных режимов для получения другого вывода для того же входа (это заменяет Ваш templatenumber параметр)
  • большую часть времени нет никакой потребности в <xsl:attribute> элементы. Они могут безопасно быть заменены встроенной нотацией (attributename="{attributevalue}")
  • использование concat() функция для создания URL

Вообще говоря, это - плохая идея сохранить оставленный HTML в базе данных (в более общем плане говорящий: Это - плохая идея сохранить HTML в базе данных.). Вы собираетесь для получения всех видов проблем, при этом этот один из них. Если Вы не можете изменить эту установку, я надеюсь, что решение помогает Вам.

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

Я нуждаюсь в перерыве теперь.;-)

18
ответ дан 5 December 2019 в 06:10
поделиться

Это плохое представление о хранении HTML в базе данных

Что? Как вы должны хранить это тогда? В XML DOC, так что вы должны использовать XSLT в любом случае? В качестве веб-разработчика мы всегда использовали базы данных SQL для хранения пользовательских данных HTML. Нет ничего плохого в этом способе до тех пор, пока он планируется должным образом для ваших целей.

1
ответ дан 5 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: