使用XSL将XML转换为HTML时部分值缺失,如何修复XSL配置?
问题解决方法
问题根源
XML根节点声明了默认命名空间urn://x-artefacts-zags-rogdinf/types/4.0.1,所有不带前缀的子元素(如SerLcs、Last等)都归属该命名空间。但XSLT的XPath查询默认会将无前缀的节点名匹配为无命名空间节点,导致你写的路径无法命中这些字段,所以无法正常取值显示。
修复方案
方案1(改动最小,适配你当前使用的XSLT 2.0版本)
在<xsl:stylesheet>标签中新增xpath-default-namespace属性,值为XML的默认命名空间地址即可,修改后的完整XSL代码如下:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="urn://x-artefacts-zags-rogdinf/root/112-51/4.0.1" xmlns="urn://x-artefacts-zags-rogdinf/types/4.0.1" xpath-default-namespace="urn://x-artefacts-zags-rogdinf/types/4.0.1"> <xsl:output method="html"/> <xsl:template match="/"> <HTML> <BODY> <H2>Birth data</H2> <span>Serial: <b> <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:BrthLcs/SerLcs"/> </b> </span> <p> <span>Number: <b> <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:BrthLcs/NumLcs"/> </b> </span> </p> <p> <span>Date: <b> <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:BrthLcs/DateLcs"/> </b> </span> </p> <H3>Additional data: </H3> <span>Last, First, Middle: <b> <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:FIOrogd/Last"/> </b> <b> <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:FIOrogd/First"/> </b> <b> <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:FIOrogd/Middle"/> </b> </span> <p> <span>Date: <b> <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:BirthDate"/> </b> </span> </p> <p> <span>Place: <b> <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:BirthPlace/@Place"/> </b> </span> </p> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
方案2(兼容XSLT 1.0版本)
显式给types命名空间声明自定义前缀,再修改所有对应字段的XPath路径:
- 在
<xsl:stylesheet>中新增命名空间声明:xmlns:tns="urn://x-artefacts-zags-rogdinf/types/4.0.1" - 把所有无前缀的字段名前加上
tns:前缀,比如把SerLcs改为tns:SerLcs,Last改为tns:Last即可。
内容的提问来源于stack exchange,提问作者OxFord_Johnson
相关产品推荐
相关产品推荐

