我要做的就是输入xsl变量的值并将其设置为新变量的名称。
我的问题:
xml文件中有一个条目(我无法控制),这是一长串搜索值。它看起来像这样:
jobSearch=12345;nameSearch=Joe;colorSearch=Blue
问题在于这些术语并不总是以相同的顺序出现或出现,有时可能是:
colorSearch=Blue;jobSearch=12345;nameSearch=Joe
甚至只是:
jobSearch=12345
我可以将字符串拆分为单独的组件,但我似乎无法弄清楚如何将搜索类型链接到搜索值。我想稍后在我的xsl中通过搜索类型调用这些变量。我认为可以在调用模板循环中执行此操作但是当我离开时,变量将超出范围。任何帮助将非常感激。 谢谢。
编辑:我正在使用XSLT 1.0,并且在以后查找键值对时访问这些术语,正如Daniel Haley在1.0中所述
答案 0 :(得分:1)
你做不到。不要发明不存在的语言功能,而是告诉我们您想要解决的问题,我们可以告诉您如何解决它。
答案 1 :(得分:0)
我想我理解你的问题;您正尝试为每种搜索类型获取一个键值对"在字符串中,对吗?所以" colorSearch" ="蓝色"," jobSearch" =" 12345"和" nameSearch" =" Joe"。正确的吗?
您没有指定XSLT的版本,因此这里有一个示例,显示了执行此操作的两种方法。一种是通过创建XML,您可以稍后查询。另一种是创建map
。第一种方法适用于XSLT 2.0和3.0。第二种方法仅适用于XSLT 3.0。 (我用Saxon-PE进行测试。)
XML输入
<example>jobSearch=12345;nameSearch=Joe;colorSearch=Blue</example>
XSLT (显示创建键值对然后引用它们。)
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
exclude-result-prefixes="xs map">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="possible-types" select="('jobSearch','nameSearch',
'colorSearch')"/>
<!--METHOD 1-->
<!--XSLT 2.0-->
<xsl:variable name="searchTypes">
<xsl:for-each select="tokenize(.,';')">
<xsl:element name="{tokenize(.,'=')[1]}">
<xsl:value-of select="tokenize(.,'=')[2]"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<!--METHOD 2-->
<!--XSLT 3.0-->
<xsl:variable name="type-map" as="map(xs:string, xs:string)"
select="map:new(
for $type in tokenize(/*,';')
return
map{tokenize($type,'=')[1] := tokenize($type,'=')[2]}
)"/>
<xsl:template match="/">
<results>
<xsl:for-each select="$possible-types">
<search-type name="{.}"
method1value="{$searchTypes/*[name()=current()]}"
method2value="{$type-map(current())}"/>
</xsl:for-each>
</results>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<results>
<search-type name="jobSearch" method1value="12345" method2value="12345"/>
<search-type name="nameSearch" method1value="Joe" method2value="Joe"/>
<search-type name="colorSearch" method1value="Blue" method2value="Blue"/>
</results>