[英]Transform XML using XSL
我正在使用简单的XSL格式化xml文件,当容器标记中没有其他数据时,该XSL可以正常工作,但如果标记中有数据,则不显示任何数据。
当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>
问题在于,对于第二个示例,已经指定了默认名称空间,因此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示例,而不适用于第一个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样本,这应该提供相同的输出。
您的XSL对于两种XML都可以正常工作。 肯定还有其他问题。 向XML节点添加属性必须不影响转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.