XSLT - лучший способ разбить и визуализировать текст через запятую как HTML - PullRequest
4 голосов
/ 25 февраля 2009

У меня есть некоторые данные в элементе XML, который выглядит следующим образом:

<item value="category1,category2">Item Name</item>

Интересующий меня бит - это атрибут value . Я могу получить данные, содержащиеся в этом атрибуте, в шаблон, который выглядит так:

<xsl:template name="RenderValues">
    <xsl:param name="ValueList" />
    <xsl:value-of select="$ValueList" /> <!-- outputs category1,category2-->
</xsl:template>

Я хочу эффективно обработать значения, разделенные запятыми. Как лучше всего сделать что-то вроде следующего из шаблона RenderValues?

<a href="x.asp?item=category1">category1</a>
<a href="x.asp?item=category2">category2</a>

Ответы [ 3 ]

8 голосов
/ 25 февраля 2009

In XSLT 2.0 / XPath 2.0 использование стандартная функция XPath 2.0 tokenize () .

В XSLT 1.0 необходимо либо написать рекурсивно вызванный шаблон, либо, что более удобно, использовать функцию str-split-to-words / шаблон библиотека FXSL .

Вот пример последнего :

<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="string(@value)"/>
          <xsl:with-param name="pDelimiters" 
                          select="', &#10;'"/>
        </xsl:call-template>
      </xsl:variable>
<!--                                                 -->
      <xsl:apply-templates select="ext:node-set($vwordNodes)/*"/>
    </xsl:template>
<!--                                                 -->
    <xsl:template match="word" priority="10">
      <a href="x.asp?item={.}"><xsl:value-of select="."/></a>
    </xsl:template>
<!--                                                 -->
</xsl:stylesheet>

Когда вышеуказанное преобразование применяется к предоставленному документу XML :

<item value="category1,category2">Item Name</item>

желаемый результат получен :

<a href="x.asp?item=category1" xmlns:ext="http://exslt.org/common">category1</a>
<a href="x.asp?item=category2" xmlns:ext="http://exslt.org/common">category2</a>

Параметр pDelimiters этого шаблона позволяет указывать несколько символов-разделителей. В приведенном выше примере любой разделяющий символ может быть запятой, пробелом или символом новой строки.

7 голосов
/ 25 февраля 2009

Вам нужна функция tokenize :

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

<xsl:template match="/">
<xsl:variable name="sampleString">XML,XSLT,XPath,SVG,XPointer</xsl:variable>
<xsl:for-each select="str:tokenize($sampleString,',')">
    <a>
        <xsl:attribute name="href">
            <xsl:value-of select="str:concat('x.asp?item=', .)" />
        </xsl:attribute>
    <xsl:value-of select="."/>
    </a>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

http://www.xml.com/pub/a/2003/05/07/tr.html

2 голосов
/ 25 февраля 2009

Это законный вопрос, и ответы на него хорошие. Но если вы используете XSLT 1.0 и не можете использовать функции расширения, это просто невозможно. Шаблоны XSLT создают фрагменты дерева результатов, а XSLT может работать только с наборами узлов. Токенизация в XSLT требует рекурсии, что означает вызов шаблона, что означает создание структуры данных, которую вы не можете обработать.

Если это ограничение относится к вам - и действительно, даже если это не так - вам следует, если возможно, решить эту проблему, найдя человека, который генерирует XML, чей контент необходимо проанализировать снова после DOM уже проанализировал его и заставил его или ее остановиться. Вводить несколько значений в атрибут просто неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...