Xml XSLT—将逗号分隔的文本拆分并呈现为HTML的最佳方法

Xml XSLT—将逗号分隔的文本拆分并呈现为HTML的最佳方法,xml,xslt,Xml,Xslt,我在XML元素中有一些数据,如下所示: <item value="category1,category2">Item Name</item> <xsl:template name="RenderValues"> <xsl:param name="ValueList" /> <xsl:value-of select="$ValueList" /> <!-- outputs category1,category2--

我在XML元素中有一些数据,如下所示:

<item value="category1,category2">Item Name</item>
<xsl:template name="RenderValues">
    <xsl:param name="ValueList" />
    <xsl:value-of select="$ValueList" /> <!-- outputs category1,category2-->
</xsl:template>
项目名称
我感兴趣的是value属性。我可以将此属性中包含的数据放入如下所示的模板中:

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

我想做的是以有效的方式处理逗号分隔的值。从RenderValue模板内部渲染以下内容的最佳方法是什么

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

您正在寻找:


XML、XSLT、XPath、SVG、XPointer
在/使用中

中,需要编写递归调用的模板,或者更方便地使用的函数/模板

下面是后者的一个例子:

<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>
项目名称
产生所需结果

<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
参数允许指定多个分隔字符。在上面的示例中,任何分隔字符都可以是逗号、空格或换行符。

这是一个合理的问题,提供的答案都是好的。但是,如果您使用的是XSLT1.0,并且不能使用扩展函数,那么这是不可能的。XSLT模板生成结果树片段,XSLT只能在节点集上工作。XSLT中的标记化需要递归,这意味着调用模板,这意味着生成无法处理的数据结构


如果这个限制适用于您——实际上,即使它不适用——如果可能的话,您应该通过查找生成XML的人来解决这个问题,该人的内容必须在DOM解析后再次解析,并让他或她停止。在一个属性中放入多个值是完全错误的。

嗨,codar,回答得很好。我冒昧地添加了一个到官方标记化函数定义的链接,并修改了问题中的示例。就编辑而言,这是一个相当严重的修改,所以如果您介意,请恢复。我写了几乎完全相同的文本,但你认为修改增加了很多。谢谢,谢谢你的回答。XML由SharePoint生成。特别是,如果为端口启用多个类别选择,则日志模板中存在的数据。除非我能控制.NET代码的执行,否则我不能使用EXSLT解决方案,这在本例中是不可能的。可以通过计算每个字符来实现,例如Hi Dimitre,这非常方便。是否可以使用此FXSL库在模板中多次拆分文本。我需要将文本分成XML的两部分。但是,第一个模板中已经使用了
word
模板,再次使用将在第二个模板中返回相同的固定文本。Thanks@MridangAgarwalla当前位置几乎一切皆有可能。请提个问题让我知道。