XSLT仅提取存在的XML节点值及取值错误修复问题
XSLT提取存在节点值的修正方案
问题1:mr:ctr节点输出false的修正
你当前匹配mr:ctr[@tg = 1000]的模板中,变量dz取值是布尔表达式tg ='1000'的计算结果,由于你已经通过match规则过滤了tg=1000的节点,直接取节点的文本值即可,修改这部分代码:
<xsl:template match="mr:ctr[@tg = 1000]"> <d:z xml:lang="en">{normalize-space(.)}</d:z> </xsl:template>
问题2:仅输出存在匹配节点的元素的实现
你现在无论对应sbf节点是否存在,都会生成d:s、d:p、d:c元素,只需要加xsl:if判断目标节点存在时再生成元素即可,修改mr:dtf的匹配模板:
<xsl:template match="mr:dtf[@tg = 12000]"> <!-- 仅sbf[@cd='a']存在时生成d:s --> <xsl:if test="sbf[@cd = 'a']"> <xsl:variable name="ds" as="xs:string">{sbf[@cd = 'a']}!</xsl:variable> <d:s xml:lang="en">{normalize-space($ds)}</d:s> </xsl:if> <!-- 仅sbf[@cd='c']存在时生成d:p --> <xsl:if test="sbf[@cd = 'c']"> <xsl:variable name="dp" as="xs:string">{sbf[@cd = 'c']}!</xsl:variable> <d:p>{normalize-space($dp)}</d:p> </xsl:if> <!-- 仅sbf[@cd='d']存在时生成d:c --> <xsl:if test="sbf[@cd = 'd']"> <xsl:variable name="dc" as="xs:string">{sbf[@cd = 'd']}!</xsl:variable> <d:c>{normalize-space($dc)}</d:c> </xsl:if> </xsl:template>
完整修正后的XSLT代码
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:d="http://www.example.com" xpath-default-namespace="http://www.lc.gov/mr2/slim" xmlns:mr="http://www.lc.gov/mr2/slim" exclude-result-prefixes="#all" expand-text="yes" version="3.0"> <xsl:mode on-no-match="shallow-copy"/> <xsl:output method="xml" indent="yes"/> <xsl:template match="collection"> <O-PM> <ListRcs> <xsl:apply-templates/> </ListRcs> </O-PM> </xsl:template> <xsl:template match="rc"> <rc> <xsl:apply-templates/> </rc> </xsl:template> <xsl:template match="mr:ctr[@tg = 1000]"> <d:z xml:lang="en">{normalize-space(.)}</d:z> </xsl:template> <xsl:template match="mr:dtf[@tg = 12000]"> <xsl:if test="sbf[@cd = 'a']"> <xsl:variable name="ds" as="xs:string">{sbf[@cd = 'a']}!</xsl:variable> <d:s xml:lang="en">{normalize-space($ds)}</d:s> </xsl:if> <xsl:if test="sbf[@cd = 'c']"> <xsl:variable name="dp" as="xs:string">{sbf[@cd = 'c']}!</xsl:variable> <d:p>{normalize-space($dp)}</d:p> </xsl:if> <xsl:if test="sbf[@cd = 'd']"> <xsl:variable name="dc" as="xs:string">{sbf[@cd = 'd']}!</xsl:variable> <d:c>{normalize-space($dc)}</d:c> </xsl:if> </xsl:template> </xsl:stylesheet>
运行上述代码后输出结果与期望输出完全一致。
内容的提问来源于stack exchange,提问作者wowefiq
相关产品推荐
相关产品推荐

