我如何使用xsl:variable作为另一个变量的名称

时间:2014-07-22 20:29:29

标签: xml xslt

我要做的就是输入xsl变量的值并将其设置为新变量的名称。

我的问题:

xml文件中有一个条目(我无法控制),这是一长串搜索值。它看起来像这样:

jobSearch=12345;nameSearch=Joe;colorSearch=Blue

问题在于这些术语并不总是以相同的顺序出现或出现,有时可能是:

colorSearch=Blue;jobSearch=12345;nameSearch=Joe

甚至只是:

jobSearch=12345

我可以将字符串拆分为单独的组件,但我似乎无法弄清楚如何将搜索类型链接到搜索值。我想稍后在我的xsl中通过搜索类型调用这些变量。我认为可以在调用模板循环中执行此操作但是当我离开时,变量将超出范围。任何帮助将非常感激。 谢谢。

编辑:我正在使用XSLT 1.0,并且在以后查找键值对时访问这些术语,正如Daniel Haley在1.0中所述

2 个答案:

答案 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>