2017-10-11 23 views
0

xmlからXSLTへの外部キーIDREFのリンクに問題があります。私はその問題を解決するために多くの方法で試みました。しかし、私はそれを表示すると、私はIDREFをXSLTから見ることができません。例えば、以下のコードは、患者の医者参照d1、d2 ...を表示しなければなりません。しかし、医者から何も表示されません。ここでIDREFからXMLへのリンク方法

は、XMLのための私のコードです:

<patient unique_no="p1" gender="F"> 
    <f_name>MMA</f_name> 

    <l_name>STONE</l_name> 

    <doctor-ref IDREF="d1"/> 
    <doctor-ref IDREF="d2"/> 
    </patient> 
    <doctor id="d1"> 
     <d_f_name>Chef Linguini</d_f_name> 
     <d_l_name>Gusteau</d_l_name> 
     <specification>&on;</specification> 
    </doctor> 
    <doctor id="d2"> 
     <d_f_name>Gordon</d_f_name> 
     <d_l_name>Ramsay</d_l_name> 
     <specification>&ENT;</specification> 
    </doctor> 
    <xsl:template match="/"> 
    <xsl:for-each select="hospital/patient"> 
     <xsl:sort select="f_name" />    
      <tr> 
     <td> 
      <xsl:value-of select="@unique_no" /> 
     </td> 
      <td> 
      <xsl:value-of select="f_name" /> 
      </td> 
      <td> 
      <xsl:value-of select="l_name" /> 
      </td> 
    <xsl:choose> 
    <xsl:when test="@gender='M'"> 
     <td bgcolor="red"> 
     <xsl:value-of select="@gender"/></td> 
    </xsl:when> 
    <xsl:when test="@gender='F'"> 
     <td bgcolor="Yellow"> 
     <xsl:value-of select="@gender"/></td> 
    </xsl:when> 
    <xsl:otherwise> 
     <td><xsl:value-of select="@gender"/></td> 
    </xsl:otherwise> 
    </xsl:choose> 
     <!-- <td>  
      <xsl:value-of select="@gender" /> 
      </td> --> 
      <td> 
    <!-- <xsl:value-of select="key('Medications', @Medications/@IDREF)"/> 
    --> 
     <xsl:value-of select="@Medications"/>   
      </td> 
      <td> 
      <xsl:value-of select="@doctor" /> 
      <xsl:if test="position() != last()"> 
     <xsl:text>, </xsl:text> 
    </xsl:if> 
      </td> 
     </tr> 
     </xsl:for-each> 
    </xsl:template> 

私の出力はまた、show.Whyなかった.But IDREFショーの医者を持っている必要がありますか?

enter image description here

答えて

0

<doctor>ノードは両方とも<hospital>ノードの下の同じレベルにあるノード、すなわち<patient>の兄弟です。 <patient>ループ内から<doctor>ノードにアクセスするには、XPath axesを使用できます。このシナリオでは

必要な出力が共有されていないので、仮定は、あなたの出力に@IDREFまたはdoctor nameのいずれかが必要だということです。同じXSLを使用して、<doctor>ノードにアクセスするには以下を実行できます。出力に応じて、<td>内のXSLコードを保持または破棄することができます。これは以下のように出力を与える

<xsl:template match="/"> 
    <xsl:for-each select="hospital/patient"> 
     <xsl:sort select="f_name" /> 
     <tr> 
      ... 
      <!-- accessing the @IDREF attribute of <doctor-ref> --> 
      <td> 
       <xsl:for-each select="doctor-ref/@IDREF"> 
        <xsl:value-of select="." /> 
        <xsl:if test="position() != last()"> 
         <xsl:text>, </xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
      </td> 
      <!-- accessing the matching @id of <doctor> with @IDREF of <doctor-ref> --> 
      <td> 
       <xsl:for-each select="doctor-ref/@IDREF"> 
        <xsl:variable name="idref" select="." /> 
        <xsl:value-of select="concat(ancestor::*/doctor[@id = $idref]/d_f_name, ' ', ancestor::*/doctor[@id = $idref]/d_l_name)" /> 
        <xsl:if test="position() != last()"> 
         <xsl:text>, </xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
      </td> 
     </tr> 
    </xsl:for-each> 
</xsl:template> 

<tr> 
    ... 
    <td>d1, d2</td> 
    <td>Chef Linguini Gusteau, Gordon Ramsay</td> 
</tr> 
関連する問題