XML文件:
<generic-cv:generic-cv xmlns:generic-cv="http://www.cihr-irsc.gc.ca/generic-cv/1.0.0" lang="en" dateTimeGenerated="2014-05-30 11:40:50">
<section id="f589cbc028c64fdaa783da01647e5e3c" label="Personal Information">
<section id="2687e70e5d45487c93a8a02626543f64" label="Identification" recordId="4f7c2ebd789f407b939e05664f6aa7c0">
<field id="ee8beaea41f049d8bcfadfbfa89ac09e" label="Title">
<lov id="00000000000000000000000000000318">Mr.</lov>
</field>
<field id="98ad36fee26a4d6b8953ea764f4fed04" label="First Name">
<value type="String">Hara</value>
</field>
</section>
<section id="2687e70e5d45487c93a8a02626543f64" label="Identification" recordId="4f7c2ebd789f407b939e05664f6aa7c0">
<field id="ee8beaea41f049d8bcfadfbfa89ac09e" label="Title">
<lov id="00000000000000000000000000000318">Mr.</lov>
</field>
<field id="98ad36fee26a4d6b8953ea764f4fed04" label="First Name">
<value type="String">ali</value>
</field>
</section>
</section>
和像这样的xslt文件
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:variable name="FirstName" select=".//field[@id='98ad36fee26a4d6b8953ea764f4fed04']/value"/>
<xsl:template match="/">
<html>
<head>
<title>Xml Convertor</title>
</head>
<body>
<h2><b> Personal Information</b></h2>
<ul>
<xsl:for-each select=".//section[@id='2687e70e5d45487c93a8a02626543f64']" >
<li>Name: $FirstName></li>
</xsl:for-each>
</ul>
</body>
</html>
而不是使用特定的代码值来获取xml文件中的正确信息。 我想使用(全局)变量,以便我可以轻松地更改值。 例如,当我想找到并显示(在html中)第一个名字时,我会查找代码“98ad36fee26a4d6b8953ea764f4fed04”。相反,我想设置一个变量,例如firstName到这个值,并在xml文件中查找变量值。但是,当我将第一个名称设置为变量并将其置于每个循环的a下时,它将只打印出名称Hara和不是阿里有没有办法可以解决这个问题,而无需在每个循环中放入变量声明
答案 0 :(得分:2)
在找到变量声明的任何上下文中评估xsl:variable
的select表达式。在您的示例中,FirstName
变量将包含来自 all 整个文档中的第一个名称字段的value
元素集(因为变量声明的上下文是根节点/
)和value-of
节点集被定义为文档顺序中集合中第一个节点的字符串值,即&#34; Hara&#34;。
在我看来,你正在尝试声明一种函数而不是变量 - 这将为你提供任何上下文的第一个名字字段的值>从中调用。在XSLT 1.0中,这意味着命名模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template name="firstName">
<xsl:value-of select=".//field[@id='98ad36fee26a4d6b8953ea764f4fed04']/value" />
</xsl:template>
<xsl:template match="/">
<html>
<head>
<title>Xml Convertor</title>
</head>
<body>
<h2><b> Personal Information</b></h2>
<ul>
<xsl:for-each select=".//section[@id='2687e70e5d45487c93a8a02626543f64']" >
<li>Name: <xsl:call-template name="firstName"/></li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
当您调用命名模板时,上下文不会更改,因此.//
模板中的firstName
将相对于for-each