XSLT样式表没有显示值

时间:2015-05-14 16:21:01

标签: html xml xslt

我正在尝试使用XSLT样式表将XML源转换为HTML页面。

XML代码在这里:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="P_44.xsl"?>
<JournalData>
<PatientData><Patient><Name>Jones, John</Name>
<CodeNumber>191212121212</CodeNumber>
<CodeNumberType>C</CodeNumberType>
<BirthDate>1912-12-12</BirthDate>
<Sex>F</Sex>
<Deceased>0</Deceased>
<DoubleReg>0</DoubleReg>
<InterpreterNeeded>0</InterpreterNeeded>
</Patient>
</PatientData>
</JournalData>

XSLT样式表在这里:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h1>Journal</h1>
<table border="1">
<tr bgcolor="#9acd32">
<th>Element name</th>
<th>Contence</th>
</tr>
<tr bgcolor="#FBF5A4">
<th>Patient</th>
</tr>
<xsl:for-each select="JournalData/PatientData/Patient/Name">
<tr>
<td><xsl:value-of select="local-name()" /></td>
<td><xsl:value-of select="Name" /></td>
</tr>  
</xsl:for-each>

<xsl:for-each select="JournalData/PatientData/Patient/CodeNumber">
<tr>
<td><xsl:value-of select="local-name()" /></td>
<td><xsl:value-of select="CodeNumber" /></td>
</tr>
</xsl:for-each>

<xsl:for-each select="JournalData/PatientData/Patient/CodeNumberType">
<tr>
<td><xsl:value-of select="local-name()" /></td>
<td><xsl:value-of select="CodeNumberType" /></td>
</tr>
</xsl:for-each>

<xsl:for-each select="JournalData/PatientData/Patient/BirthDate">
<tr>
<td><xsl:value-of select="local-name()" /></td>
<td><xsl:value-of select="BirthDate" /></td>
</tr>
</xsl:for-each>

<xsl:for-each select="JournalData/PatientData/Patient/Sex">
<tr>
<td><xsl:value-of select="local-name()" /></td>
<td><xsl:value-of select="Sex" /></td>
</tr>
</xsl:for-each>

<xsl:for-each select="JournalData/PatientData/Patient/Deceased">
<tr>
<td><xsl:value-of select="local-name()" /></td>
<td><xsl:value-of select="Deceased" /></td>
</tr>
</xsl:for-each>

<xsl:for-each select="JournalData/PatientData/Patient/DoubleReg">
<tr>
<td><xsl:value-of select="local-name()" /></td>
<td><xsl:value-of select="DoubleReg" /></td>
</tr>
</xsl:for-each>

<xsl:for-each select="JournalData/PatientData/Patient/InterpreterNeeded">
<tr>
<td><xsl:value-of select="local-name()" /></td>
<td><xsl:value-of select="InterpreterNeeded" /></td>
</tr>
</xsl:for-each>
</table> 
</body>
</html>
</xsl:template>

</xsl:stylesheet>

这转换为一个漂亮的两列HTML表,其中第一个列打印出元素名称,但第二列是空白。为什么不显示值?样式表有什么问题?

非常感谢你们两位。我现在就开始工作了。这些列现在继续向下,在黄色背景上有一个新标题(就像“Patient”),名为“PatientAddress”。它更进一步嵌套:
                                                                                             

变                                                                                       

一切都很好,只是为了一个烦人的细节。由于元素名称“PatientAdress”是“患者”下的孩子,因此它被双重打印。首先当“患者”下的所有孩子(正确的术语?)被打印时,“PatientAdress”下的所有值都在一行中,然后在我设置时再次

如何摆脱第一个实例?看起来像这样:

PatientAddress Bondstreet 9 211 11 Mersey Surrey 12 Surrey 72

应该只是这样:

<tr bgcolor="#FBF5A4"><th>PatientAddress</th></tr><tr><td>Address1</td>   <td>Bondstreet 9</td></tr><tr><td>ZipCode</td><td>211 11</td></tr><tr><td>City</td><td>Mersey</td></tr><tr><td>State</td><td>Surrey</td></tr><tr><td>StateCode</td><td>12</td></tr><tr><td>District</td><td>Surrey</td></tr><tr><td>DistrictCode</td><td>72</td></tr></tbody></table></body></html>

(试图粘贴好看的表,但没有成功......: - ()

3 个答案:

答案 0 :(得分:1)

for-each内部,您只需使用<xsl:value-of select="."/>输出上下文节点的字符串值。如果您使用<xsl:value-of select="foo"/>,那么您将查找上下文节点的该名称的子元素。

答案 1 :(得分:0)

只需对每个Patient进行一次迭代,然后对Patient的每个孩子进行一次迭代:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h1>Journal</h1>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Element name</th>
            <th>Contence</th>
          </tr>
          <xsl:for-each select="JournalData/PatientData/Patient">
            <tr bgcolor="#FBF5A4">
              <th>Patient</th>
            </tr>
            <xsl:for-each select="*">
              <tr>
                <td><xsl:value-of select="local-name()"/></td>
                <td><xsl:value-of select="." /></td>
              </tr>  
            </xsl:for-each>
          </xsl:for-each>
        </table> 
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

然后XSLT会像这样设置你的XML样式:

enter image description here

答案 2 :(得分:0)

问题是,在<xsl:for-each>元素中,您已经匹配了所需的元素。例如:

<xsl:for-each select="JournalData/PatientData/Patient/Name">
    <tr>
        <td><xsl:value-of select="local-name()" /></td>
        <td><xsl:value-of select="Name" /></td>
    </tr>  
</xsl:for-each>

在这里,您已经在<xsl:for-each>中匹配了名称,因此在<xsl:value-of select="Name" />中,您实际上是在尝试查找Name的Name子项的值。而且没有一个。您只需使用<xsl:value-of select="."/>来获取您所在元素的值。

而不是替换模板中的所有这些行,您可以按如下方式执行一次:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <html>
            <body>
                <h1>Journal</h1>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Element name</th>
                        <th>Contence</th>
                    </tr>
                    <tr bgcolor="#FBF5A4">
                        <th>Patient</th>
                    </tr>

                    <xsl:apply-templates select="//Patient/*"/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="Patient/*">
        <tr>
            <td>
                <xsl:value-of select="local-name()" />
            </td>
            <td>
                <xsl:value-of select="." />
            </td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

这将为您在此处显示的输入获得所需的结果,但我不知道您希望它如何查找许多患者记录。