XSLT转换无法选择根元素'mdRecord'的问题咨询
问题原因及解决方案
核心问题:命名空间未正确绑定
你的XML根元素mdRecord属于默认命名空间(即XML里的xmlns="[url]"属性),而XPath规则是:如果不指定命名空间前缀,只会匹配没有命名空间的元素。你当前的XSLT里没有给这个默认命名空间绑定前缀,所以select="mdRecord"根本找不到目标元素。
具体修改步骤
在XSLT的
<xsl:stylesheet>标签中,给XML的默认命名空间添加一个前缀绑定,比如:xmlns:my="原XML中默认命名空间的URL"(把
原XML中默认命名空间的URL替换成你XML里xmlns="[url]"里的实际URL)修改
dataProvider模板里的select语句,带上前缀:
因为dataProvider模板是从根节点(/)上下文调用的,所以要写成/my:mdRecord,确保从文档根开始查找。
修改后的完整XSLT示例
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="[url]" xmlns:xsi="[url]" xmlns:oai_dc="[url]" xmlns:dc="[url]" xmlns:dcterms="[url]" xmlns:mods="[url]" xmlns:rdf="[url]" xmlns:edm="[url]" <!-- 新增默认命名空间绑定 --> xmlns:my="原XML默认命名空间的实际URL" xsi:schemaLocation="[url]" exclude-result-prefixes="oai_dc dc dcterms xsi rdf edm my"> <xsl:output method="xml" indent="yes" encoding="utf-8"/> <xsl:strip-space elements="*" /> <xsl:template match="/"> <mods:mods> <xsl:call-template name="dataProvider"/> </mods:mods> </xsl:template> <xsl:template name="dataProvider"> <!-- 带上命名空间前缀,从根节点开始查找 --> <xsl:for-each select="/my:mdRecord"> <mods:note type="ownership"> <xsl:text>University of Northern Colorado</xsl:text> </mods:note> </xsl:for-each> </xsl:template> </xsl:stylesheet>
额外优化建议
你也可以直接在根模板里匹配my:mdRecord,这样上下文更清晰,不用写for-each:
<xsl:template match="/my:mdRecord"> <mods:mods> <mods:note type="ownership"> <xsl:text>University of Northern Colorado</xsl:text> </mods:note> </mods:mods> </xsl:template>
内容的提问来源于stack exchange,提问作者pfeffeneiger
相关产品推荐
相关产品推荐

