我正在尝试使用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>
(试图粘贴好看的表,但没有成功......: - ()
答案 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样式:
答案 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>
这将为您在此处显示的输入获得所需的结果,但我不知道您希望它如何查找许多患者记录。