我在写xapth时遇到了问题。让我解释一下这个问题。
我正在编写xslt来转换一些xml。 xslt还将一个xml文件从磁盘加载到xslt变量中。
PeopleXml.xml :
<TestXml>
<People>
<Person id="MSA1" name="Sachin">
<Profession>
<Role>Developer</Role>
</Profession>
</Person>
<Person id="ZAG4" name="Rahul">
<Profession>
<Role>Tester</Role>
</Profession>
</Person>
</People>
</TestXml>
XSLT :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://MyNamespace"
version="2.0">
<xsl:variable name="PeopleXml" select ="document('PeopleXml.xml')"/>
<xsl:variable name="peopleList" select="$PeopleXml/TestXml/People/Person"/>
<xsl:variable name="person1" select="MSA1"/>
<xsl:variable name="person" select="$peopleList/Person[@id=$person1]/@name"/>
<xsl:template match="/">
<xsl:value-of select="$person"/>
</xsl:template>
</xsl:stylesheet>
问题:xpath“$ peopleList / Person [@ id = $ person1] / @ name”未返回任何内容。事实上,$ peopleList / Person也不起作用。但是,当我调试代码时,我可以在$ peopleList变量中看到两个人节点。
有没有人可以帮助我,我在xpath中做错了什么?
修改 应用Daniel的解决方案后,上面的xapth问题已得到解决。现在,唯一的问题仍然是根据某些条件访问人的子节点。
以下测试不起作用。
<xsl:variable name="roleDev" select="'Developer'"/>
<xsl:when test="$peopleList/Profession/Role=$roleDev">
<xsl:value-of select="We have atleast one Developer"/>
</xsl:when>
答案 0 :(得分:2)
由于变量peopleList
已经是Person
个节点,您应该像这样访问它们:
<xsl:variable name="person" select="$peopleList[@id=$person1]/@name"/>
答案 1 :(得分:2)
您的问题在这里:
<xsl:variable name="person1" select="MSA1"/>
这会导致$person1
变量为空。
为什么?
因为评估了表达式 MSA1
- 当前节点没有任何名为“MSA1”的子节点,所以没有选择任何子节点。
<强>解决方案强>:
将所需字符串指定为字符串文字:
<xsl:variable name="person1" select="'MSA1'"/>
您的第二个问题:
现在,唯一的问题仍然是访问基于人的子节点 在某种情况下。
使用强>:
boolean($peopleList[Profession/Role = 'Developer'])
当true()
中存在一个节点,使其至少有一个$peopleList
crand-child,其字符串值为字符串Profession/Role
时,就会生成"Developer"