如何将IDREF FROM XML链接到XSLT

时间:2017-10-11 04:33:40

标签: xml xslt

我在将外键IDREF从xml链接到XSLT时遇到问题。我已经尝试过很多方法来解决这个问题。但是当我显示它时,我无法从XSLT看到我的IDREF。例如,下面的代码应该显示患者医生参考d1,d2 ......等。但是它没有显示医生的任何信息。有人帮我解决了吗?

这是我的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> 

我的输出也应该显示医生idref。但它没有显示。为什么? enter image description here

1 个答案:

答案 0 :(得分:0)

<doctor>节点是<patient>节点的兄弟节点,即两者在<hospital>节点下处于同一级别。要从<doctor>循环中访问<patient>节点,可以使用XPath axes

在这种情况下,由于未共享所需的输出,因此假设您需要输出中的@IDREFdoctor 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>