You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:57:01