将XML属性的值存储在XSL变量中

时间:2017-07-02 07:13:16

标签: xml variables xslt

我想使用XML属性的值并存储并在XSL文件中进行比较。我正在通过JAVA程序将XSL转换为HTML,这很好。输出HTML是: -

值=

XML文件:

<root>
<Request>
    <Desc>Insert new team into the table</Desc>
    <Param name="teamName" required="false"/>
    <Param name="rankings" required="true"/>
    <Update requires="teamName,rankings" >
        INSERT INTO standing (teamName,rankings) VALUES($rankings,$rankings)
    </Update>
</Request>

XSL文件:

<xsl:template match="root">
    <xsl:variable name="UpdateRequires"/>
    <html>
        <head>
            <title>DocStyle.xsl</title>
        </head>
        <body> 
            <xsl:for-each select="*/Request">
                <xsl:for-each select="*/Update">
                    <xsl:variable name="UpdateRequires" select="*/Update/@requires"/>
                </xsl:for-each>
            </xsl:for-each>
            <h1>
               Value = <xsl:value-of select="$UpdateRequires"/>
            </h1>
        </body>
    </html>
</xsl:template>

我想显示变量&#34; UpdateRequires&#34;的值,然后将其与Param标签的属性&#34; @ name&#34;进行比较。也许这样&#34;包含(@ name,UpdateRequires)&#34;

更新1.0:

我能够获取变量的值,现在我想比较变量$ UpdateRequires的值和属性@name的值。 它应该为包含(@ name,$ UpdateRequires)而返回true,它没有做(带有test =&#34的if循环; @ name&#34;只是为了检查值)

对XSL所做的更改:

<xsl:for-each select="Request">
                <xsl:variable name="UpdateRequires" select="*/@requires"/>
                <xsl:for-each select="Update">
                    <xsl:variable name="UpdateRequires" select="@requires"/>
                    <h1>
                        We are in Update : <xsl:value-of select="$UpdateRequires"/>
                    </h1>    
                </xsl:for-each>
                <xsl:for-each select="Param">
                    <xsl:if test=" contains(@name,$UpdateRequires) ">
                        <span>
                            We are in Param : <xsl:value-of select="$UpdateRequires"/>
                        </span>
                    </xsl:if>
                    <xsl:if test=" @name ">
                        <span>
                            We are in Param : <br/> Value of variable : <xsl:value-of select="$UpdateRequires"/> Value of name : <xsl:value-of select="@name"/> <br/>
                        </span>
                    </xsl:if>
                </xsl:for-each>

2 个答案:

答案 0 :(得分:2)

您的方法存在几个问题:

首先,你的XPath表达式是错误的:Requestroot的孩子,而不是它的孙子 - 所以你的指令<xsl:for-each select="*/Request">什么都不做。

同样,<xsl:for-each select="*/Update">将不会对Request的上下文做任何事情。

接下来,变量的范围仅限于其父元素:如果在xsl:for-each中定义变量,则不能在此指令之外使用它。

尝试类似的事情:

<xsl:template match="/root">
    <html>
        <head>
            <title>DocStyle.xsl</title>
        </head>
        <body> 
            <xsl:for-each select="Request">
                <xsl:variable name="UpdateRequires" select="Update/@requires"/>
                <h1>
                   Value = <xsl:value-of select="$UpdateRequires"/>
                </h1>
             </xsl:for-each>
        </body>
    </html>
</xsl:template>

请注意,这假设可能有多个Request,但每个只有一个Update个孩子。

答案 1 :(得分:1)

<xsl:for-each select="Request">
                <xsl:variable name="UpdateRequires" select="*/@requires"/>
                <xsl:for-each select="Update">
                    <xsl:variable name="UpdateRequires" select="@requires"/>
                    <h1>
                        We are in Update : <xsl:value-of select="$UpdateRequires"/>
                    </h1>    
                </xsl:for-each>
                <xsl:for-each select="Param">
                    <xsl:if test=" matches($UpdateRequires,@name) ">
                        <span>
                            We are in Param : <xsl:value-of select="$UpdateRequires"/><br/>
                        </span>
                    </xsl:if>
                </xsl:for-each>
            </xsl:for-each>

contains()函数没有返回true(有人可以告诉我为什么吗?)因此我使用了matches()。它现在有效。