3

我在写 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 中做错了什么?

编辑 应用丹尼尔的解决方案后,上面的 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>
4

2 回答 2

2

由于变量peopleList已经是Person节点,您应该像这样访问它们:

<xsl:variable name="person" select="$peopleList[@id=$person1]/@name"/>
于 2012-12-12T08:22:06.063 回答
2

你的问题在这里

<xsl:variable name="person1" select="MSA1"/>

这导致$person1变量为。为什么?

因为表达式 MSA1已被计算——当前节点没有任何名为“MSA1”的子节点,因此没有选择任何内容。

解决方案

将所需字符串指定为字符串文字:

<xsl:variable name="person1" select="'MSA1'"/>

你的第二个问题

现在,唯一剩下的问题是根据某些条件访问人的子节点。

使用

boolean($peopleList[Profession/Role = 'Developer'])

true()恰好在有一个节点时产生$peopleList,它至少有一个Profession/Role字符串值是字符串的 crand-child"Developer"

于 2012-12-12T13:23:14.620 回答