gpt4 book ai didi

xml - 在 Visual Studio 中使用 XSL 标记化或拆分字符串

转载 作者:行者123 更新时间:2023-12-02 04:59:28 25 4
gpt4 key购买 nike

我在 Visual Studio 2010 中使用 XSL。我有以下 *XSL* 文件,我正在尝试使用 tokenize() 函数来拆分字符串:

<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
<xsl:output media-type="text/html; charset=UTF-8" encoding="UTF-8"/>

<xsl:template match='/'>
<html>
<head> </head>
<body>
<ul>
<xsl:apply-templates select="response/result/doc"/>
</ul>
</body>
</html>
</xsl:template>

<xsl:template match="doc">
<xsl:variable name="title" select="str[@name='Title']"/>
<xsl:variable name="features" select="tokenize(str[@name='Desc'],';')"/>
<li>
<xsl:value-of select="$title"/>
<ul>
<xsl:for-each select="$features">
<li>
<xsl:value-of select="."/>
</li>
</xsl:for-each>

</ul>
</li>
</xsl:template>
</xsl:stylesheet>

注意:此时我不确定我是否真的在使用 XSLT 2.0 版。我想我这样做是因为我将它设置在第一行。

对于上面的 XSL,我在 Visual Studio 2010 中得到以下错误:

'tokenize()' is an unknown XSLT function.

我有以下输入 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<result name="response" numFound="10000" start="0">
<doc>
<str name="Title">Title 1</str>
<str name="Desc">Feature 1; Feature 2; Feature 3;</str>
</doc>
<doc>
<str name="Title">Title 2</str>
<str name="Desc">Feature 1; Feature 2; Feature 3;</str>
</doc>
</result>
</response>

理想情况下,我希望输出类似于下面的 HTML 文件:

<html>
<head> </head>
<body>
<ul>
<li>Title 1
<ul>
<li>Feature 1</li>
<li>Feature 2</li>
<li>Feature 3</li>
</ul>
</li>
<li>Title 2
<ul>
<li>Feature 1</li>
<li>Feature 2</li>
<li>Feature 3</li>
</ul>
</li>
</ul>
</body>
</html>

如何在 XML 文件中tokenize() 或拆分字符串 Desc?请忽略这里的空格,即输出文件之前或之后的一点额外空间没有意义,因为输出是 HTML

最佳答案

XSLT 2.0 在 Visual Studio 或 .NET 中不受原生支持。当您尝试执行 XSLT 2.0 样式表时,您将在尝试使用 2.0 函数时遇到错误。

选项 #1:以下 XSLT 1.0 样式表使用递归模板来实现相同的结果,但没有 tokenize()功能:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
<xsl:output media-type="text/html; charset=UTF-8" encoding="UTF-8"/>

<xsl:template match='/'>
<html>
<head> </head>
<body>
<ul>
<xsl:apply-templates select="response/result/doc"/>
</ul>
</body>
</html>
</xsl:template>

<xsl:template match="doc">
<li>
<xsl:value-of select="str[@name='Title']"/>
<ul>
<xsl:call-template name="listItem">
<xsl:with-param name="features" select="str[@name='Desc']"/>
</xsl:call-template>
</ul>
</li>
</xsl:template>

<xsl:template name="listItem">
<xsl:param name="features"/>
<xsl:param name="delimiter" select="';'"/>
<xsl:choose>
<xsl:when test="contains($features, $delimiter)">
<li>
<xsl:value-of select="normalize-space(
substring-before($features, $delimiter))"/>
</li>
<xsl:variable name="nextValue" select="substring-after($features,
$delimiter)"/>
<xsl:if test="normalize-space($nextValue)">
<xsl:call-template name="listItem">
<xsl:with-param name="features" select="$nextValue"/>
<xsl:with-param name="delimiter" select="$delimiter"/>
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<li>
<xsl:value-of select="$features"/>
</li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

选项#2:您还应该能够添加 EXSLT.NET reference in Visual Studio然后就可以使用 EXSLT str:tokenize() 函数:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
xmlns:str="http://exslt.org/strings" >
<xsl:output media-type="text/html; charset=UTF-8" encoding="UTF-8"/>

<xsl:template match='/'>
<html>
<head> </head>
<body>
<ul>
<xsl:apply-templates select="response/result/doc"/>
</ul>
</body>
</html>
</xsl:template>

<xsl:template match="doc">
<li>
<xsl:value-of select="str[@name='Title']"/>
<ul>
<xsl:for-each select="str:tokenize(str[@name='Desc'], ';')">
<li>
<xsl:value-of select="normalize-space(.)"/>
</li>
</xsl:for-each>
</ul>
</li>
</xsl:template>
</xsl:stylesheet>

关于xml - 在 Visual Studio 中使用 XSL 标记化或拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17352340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com