Tokenizer无法在xsl中工作

时间:2014-04-24 12:41:40

标签: xslt

我试图在xsl中对字符串进行标记,尽管它不起作用,也没有给出任何错误。

的xsl:

<xsl:template name="checkCheckBoxValue">
        <xsl:param name="elementId" />
        <xsl:param name="mode" />
        <xsl:for-each select="/Properties/Data/Result/ValidationErrors/FieldName">
            <xsl:if test="$elementId = @name ">  
            <xsl:for-each select="tokenize(@text, ',')">
            <xsl:if test=" mode = current() ">
                <xsl:attribute name="checked">
                                    <xsl:value-of select=" 'checked' " />
                                </xsl:attribute>
                                </xsl:if>
            </xsl:for-each>


            </xsl:if>
        </xsl:for-each>
    </xsl:template>
@text中的值是火车,公共汽车,渡轮 我在模式中单独传递这些值。

2 个答案:

答案 0 :(得分:1)

我希望<xsl:if test=" mode内的for-each错误告诉您上下文项是一个字符串值,这样做mode来访问子节点是没有意义的。

使用<xsl:if test="$mode = .">,假设您要比较mode参数。总而言之,您应该能够将代码缩短为

<xsl:template name="checkCheckBoxValue">
        <xsl:param name="elementId" />
        <xsl:param name="mode" />
        <xsl:for-each select="/Properties/Data/Result/ValidationErrors/FieldName[$elementId = @name]">
            <xsl:for-each select="tokenize(@text, ',')[$mode = .]">

                <xsl:attribute name="checked">checked</xsl:attribute>

            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>

答案 1 :(得分:0)

我使用此源测试了您的XSLT模板:

<Properties>
    <Data>
        <Result>
            <ValidationErrors>
                <FieldName name="first" text="Train,Bus,Ferry"></FieldName>
            </ValidationErrors>
        </Result>
    </Data>
</Properties>

并将其放在一个完整的XSLT样式表中,模板调用您的模板传递一些参数以允许if:test运行:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:template match="/">
        <result>
        <xsl:call-template name="checkCheckBoxValue">
            <xsl:with-param name="elementId">first</xsl:with-param>
            <xsl:with-param name="mode" select="('Train')"/>
        </xsl:call-template>
        </result>
    </xsl:template>

    <xsl:template name="checkCheckBoxValue">
        <xsl:param name="elementId" />
        <xsl:param name="mode" />
        <xsl:for-each select="/Properties/Data/Result/ValidationErrors/FieldName">
            <xsl:if test="$elementId = @name ">  
                <xsl:for-each select="tokenize(@text, ',')">
                    <xsl:if test=" $mode = current() ">
                        <xsl:attribute name="checked">
                            <xsl:value-of select=" 'checked' " />
                        </xsl:attribute>
                    </xsl:if>
                </xsl:for-each>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

我发现的唯一错误是mode变量,该xsl:if变量在$内没有$被调用。添加它工作的<result checked="checked"/> 并生成以下结果:

{{1}}

如果此测试用例与您的问题相符且无法正常工作,原因可能在其他地方(在您的来源或其他模板中干扰它。