Разделение строки с помощью xslt clientside - PullRequest
2 голосов
/ 21 июня 2011

Мне нужно разделить строку через запятую с помощью xslt 1.0 на стороне клиента .... Возможно ли такое ?? ?? 1001 *

Я попробовал метод, подобный

Решение Stackoverflow

Я получил сообщение об ошибке в firefox, в котором говорится, что он обнаружил рекурсию и там останавливается. Моя проблема в том, что я возвращаю данные с моего SQL-сервера в виде XML, и существует связь 1 со многими, 1 запись в блоге с несколькими тегами [т.е. Поэтому я добавляю «теги» в виде поля с разделителями-запятыми внутри тега xml и хочу снова разделить его на стороне клиента. В качестве альтернативы, если есть какой-то способ просто создать вложенный список полей из XML-кода SQL Server, который тоже будет работать

то есть вместо "Cars, Red, 2010" я мог бы вернуть

<tags>
    <tag>cars</tag>
    <tag>red</tag>
    <tag>2010</tag>
</tags>

Я использую MS SQL Server 2008, ASP.NET 4.0 и XSLT 1.0 в браузере, так что эти инструменты мне доступны. Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Люди правы, что XML может быть сгенерирован на стороне сервера, однако, если вы решили отложить это поколение, вот как это сделать на клиенте, используя XSLT1.0 (XSLT 2.0 можетпросто используйте стандартную функцию XPath 2.0 tokenize(), но современные браузеры напрямую не поддерживают XSLT 2.0):

<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="/*">
  <tags>
   <xsl:apply-templates/>
  </tags>
 </xsl:template>

 <xsl:template match="text()" name="split">
   <xsl:param name="pText" select="."/>
   <xsl:param name="pDelim" select="', '"/>
   <xsl:param name="pTagName" select="'tag'"/>

     <xsl:if test="string-length($pText) >0">
       <xsl:element name="{$pTagName}">
         <xsl:value-of select=
         "substring-before(concat($pText, $pDelim), $pDelim)"/>
       </xsl:element>

       <xsl:call-template name="split">
        <xsl:with-param name="pText" select=
         "substring-after($pText, $pDelim)"/>
        <xsl:with-param name="pDelim" select="$pDelim"/>
        <xsl:with-param name="pTagName" select="$pTagName"/>
       </xsl:call-template>
     </xsl:if>
 </xsl:template>
</xsl:stylesheet>

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

<t>cars, red, 2010</t>

желаемый, правильный результат получается :

<tags>
   <tag>cars</tag>
   <tag>red</tag>
   <tag>2010</tag>
</tags>

Заметьте : универсальность этого решения - текст, строка-разделитель и «тэг» все указываются в качестве параметров.

0 голосов
/ 21 июня 2011

Если вы вместо этого сохранили свои данные в формате XML (т. Е. Не разбиваете HTML на список через запятую) , вы можете использовать данные напрямую.

declare @data as XML

set @data = '<tags>'
          + '<tag>cars</tag>'
          + '<tag>red</tag>'
          + '<tag>2010</tag>'
          + '</tags>'

SELECT tag.value('text()[1]', 'varchar(50)') as 'tags'
FROM   @data.nodes('/tags/tag') AS tags(tag)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...