我正在使用简单的XSL格式化xml文件,当容器标记中没有其他数据时它可以正常工作,但如果标记中有数据则不显示任何数据。
当XML就像这样时很好
<Result>
<primaryTopic>
<CompanyName>ZENITH PRINT (UK) LIMITED</CompanyName>
<RegAddress>
<AddressLine1>ZENITH HOUSE</AddressLine1>
<AddressLine2>MOY ROAD INDUSTRIAL ESTATE</AddressLine2>
<PostTown>TAFFS WELL</PostTown>
<County>CARDIFF</County>
<Postcode>CF15 7QR</Postcode>
</RegAddress>
当标签中有url数据时,它会失败
<Result xmlns="http://#####.uk/terms/xxx">
<primaryTopic>
<CompanyName>ZENITH PRINT (UK) LIMITED</CompanyName>
<RegAddress href="http://#####.uk/doc/company/02050399#RegAddress">
<AddressLine1>ZENITH HOUSE</AddressLine1>
<AddressLine2>MOY ROAD INDUSTRIAL ESTATE</AddressLine2>
<PostTown>TAFFS WELL</PostTown>
<County>CARDIFF</County>
<Postcode>CF15 7QR</Postcode>
</RegAddress>
我正在使用的XSL
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2><xsl:value-of select="Result/primaryTopic/CompanyName"/></h2>
<table border="1">
<tr>
<td>Company Name</td>
<td><xsl:value-of select="Result/primaryTopic/CompanyName"/></td>
<td>Address</td>
<td><xsl:value-of select="Result/primaryTopic/RegAddress/AddressLine1"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
问题是,对于第二个示例,指定了一个默认命名空间,因此XML中的所有元素都将成为该命名空间的一部分
<Result xmlns="http://#####.uk/terms/xxx">
但是,您的XSLT正在寻找没有命名空间的元素,因此它不会与XML中具有命名空间的元素匹配。
解决方案是在匹配元素
时确保命名空间是XSLT的一部分<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xxx="http://#####.uk/terms/xxx" exclude-result-prefixes="xxx">
<xsl:template match="/">
<html>
<body>
<h2>
<xsl:value-of select="xxx:Result/xxx:primaryTopic/xxx:CompanyName"/>
</h2>
<table border="1">
<tr>
<td>Company Name</td>
<td>
<xsl:value-of select="xxx:Result/xxx:primaryTopic/xxx:CompanyName"/>
</td>
<td>Address</td>
<td>
<xsl:value-of select="xxx:Result/xxx:primaryTopic/xxx:RegAddress/xxx:AddressLine1"/>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
当然,这只适用于您的第二个XML示例,而不是第一个。如果你想要一个可以同时使用这两个样本的XSLT,你可以做这样的事情来检查元素名称而不管命名空间。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/*/*[local-name()='primaryTopic']">
<html>
<body>
<h2>
<xsl:value-of select="*[local-name() = 'CompanyName']"/>
</h2>
<table border="1">
<tr>
<td>Company Name</td>
<td>
<xsl:value-of select="*[local-name() = 'CompanyName']"/>
</td>
<td>Address</td>
<td>
<xsl:value-of select="*[local-name() = 'RegAddress']/*[local-name() = 'AddressLine1']"/>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
这应该为第一个和第二个XML样本提供相同的输出。
答案 1 :(得分:0)
您的XSL适用于两种XML。肯定会出现其他问题。将属性添加到XML节点不得影响转换。