3

xapthを書く際に問題に直面しています。問題を説明しましょう。

一部のxmlを変換するためにxsltを書いています。また、xslt は、1 つの 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 変数に 2 つの person ノードが表示されます。

xpathで何が間違っているのか、誰かが私を助けてくれますか?

編集 上記の xapth の問題は、ダニエルのソリューションを適用した後に解決されました。現在、残っている唯一の問題は、いくつかの条件に基づいて person の子ノードにアクセスすることです。

次のテストは機能しません。

<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'"/>

2 番目の質問:

現在、残っている唯一の問題は、いくつかの条件に基づいて person の子ノードにアクセスすることです。

使用:

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

これは、文字列値が文字列である少なくとも 1 つのcrand-child を持つようなtrue()ノードがある場合に正確に生成します$peopleListProfession/Role"Developer"

于 2012-12-12T13:23:14.620 に答える