Xpath不处理具有xml字符串的变量

时间:2012-12-12 07:50:09

标签: xslt xpath xslt-2.0

我在写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>

2 个答案:

答案 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"