我想使用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>
答案 0 :(得分:2)
您的方法存在几个问题:
首先,你的XPath表达式是错误的:Request
是root
的孩子,而不是它的孙子 - 所以你的指令<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()。它现在有效。