XSL-FO样式表中XPath匹配动态命名空间前缀问题求助
这问题我碰到过好多次了,命名空间前缀不固定确实头疼,但其实解决思路很简单——咱们根本不用管XML里的前缀是什么,只要抓准命名空间URI就行!
解决步骤
1. 在XSL-FO样式表里绑定固定命名空间
在你的XSL-FO样式表顶部,给目标命名空间(http://www.foo.com/foo1)分配一个你自己能掌控的固定前缀(比如我习惯用foo),不用管XML里的前缀是ns1还是别的什么:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:foo="http://www.foo.com/foo1"> <!-- 绑定目标命名空间URI -->
2. 用自定义前缀写XPath表达式
之后写XPath的时候,就用你自己声明的foo前缀来匹配元素,完全不用理会XML里的前缀变化:
比如要匹配根元素<ns1:letter>,就写/foo:letter;要提取里面的<surname>值,就写foo:letter/foo:surname。
完整示例
下面是一个能提取你示例XML中surname值的XSL-FO样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:foo="http://www.foo.com/foo1"> <xsl:template match="/"> <fo:root> <fo:layout-master-set> <fo:simple-page-master master-name="page" page-height="29.7cm" page-width="21cm" margin="2cm"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="page"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="16pt"> 姓氏:<xsl:value-of select="foo:letter/foo:surname"/> </fo:block> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> </xsl:stylesheet>
原理说明
XSLT和XPath的匹配逻辑是基于命名空间URI而非前缀的——只要样式表里声明的前缀对应的URI,和XML中元素的命名空间URI完全一致,不管XML里的前缀是ns1、abc还是随便什么,都能精准匹配到目标元素。
内容的提问来源于stack exchange,提问作者user871611
相关产品推荐
相关产品推荐

