Во-первых, функция разметить используется не на самом деле правильно. Теоретически, он должен выплюнуть список тегов элементов (строго говоря, «фрагмент дерева результата»), как так
<tag>a</tag>
<tag>b</tag>
<tag>c</tag>
<tag>d</tag>
Но это на самом деле хватает последнего элемента
<tag>a</tag>
<tag>b</tag>
<tag>c</tag>
<tag></tag>
You вероятно, лучше найти другую функцию tokenize здесь (в StackOverflow обязательно должны быть рабочие).
Но, в ответ на ваш вопрос об использовании XSL: для каждого-за этого, вы могли бы попытаться сделать что-то вроде этого ...
<xsl:variable name="tags">
<xsl:call-template name="tokenize">
<xsl:with-param name="pText" select="@CommaSeparated"/>
</xsl:call-template>
</xsl:variable>
<xsl:for-each select="$tags/tag">
<xsl:copy-of select="." />
</xsl:for-each>
То есть, хранить список тегов в переменную, а затем петлю над ними. Однако, если вы попробуете это в XSLT1.0, вы получите сообщение об ошибке «Выражение должно оцениваться с помощью набора узлов». Чтобы обойти это, вам нужно использовать функцию расширения. EXSLT, вероятно, самый распространенный. Вы бы заявить об этом в вашем XSLT как так
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl">
Вы можете их просто изменить XSL: в обмен на каждого следующим образом:
<xsl:for-each select="exsl:node-set($tags)/tag">
Таким образом, учитывая следующие XML
<a CommaSeparated="a,b,c,d"></a>
И следующие XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/a">
<xsl:variable name="tags">
<xsl:call-template name="tokenize">
<xsl:with-param name="pText" select="@CommaSeparated"/>
</xsl:call-template>
</xsl:variable>
<xsl:for-each select="exsl:node-set($tags)/tag">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="pText"/>
<xsl:if test="string-length($pText)">
<tag>
<xsl:value-of select="substring-before($pText, ',')"/>
</tag>
<xsl:call-template name="tokenize">
<xsl:with-param name="pText" select="substring-after($pText, ',')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Ниже выводится (с последним тэгом пустым из-за прослушивают разметить функции вы используете)
<tag>a</tag>
<tag>b</tag>
<tag>c</tag>
<tag></tag>
Так Каков ваш вопрос? –
Вы спрашиваете, поддерживает ли XSLT для каждого? Да, это так - 'xsl: for-each', thoguh лучше избегать использования шаблона, где это возможно. – Utkanos
Для записи, что я закончил делать, написать несколько Tokenize-подобных функций, которые будут делать разделение и вывод. Таким образом, шаблон «Tokenize_Links» будет принимать «a, b, c» и « a, b и т. Д.». – user1472408