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

在XSLT的for-each循环中使用if排除指定文档的问题

解决XSLT过滤特定标题文档的问题

刚接触XSLT3天就能尝试写循环和条件判断已经很棒啦!咱们来一步步解决你的问题~

先说说你现有代码里的几个小问题:

  • 你的xsl:for-each路径写错了:/process/documents[1]/document[1]/只会选中第一个document节点,而且末尾的斜杠是多余的。要选中所有document节点,应该写成/process/documents/document
  • 条件判断里的路径完全不符合你的XML结构:原XML里titel是直接作为document的子元素存在的,没有element和value节点,所以不需要写那么复杂的路径
  • 在for-each内部,当前节点就是document,所以直接用相对路径(比如titel)就可以,不用每次都写完整的绝对路径

正确的实现方式(两种可选)

方式一:用for-each + if(和你原来的思路最接近)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <documents>
      <!-- 遍历所有document节点 -->
      <xsl:for-each select="/process/documents/document">
        <!-- 判断当前document的titel不是"Doc1" -->
        <xsl:if test="titel != 'Doc1'">
          <document filename="{titel}"/>
        </xsl:if>
      </xsl:for-each>
    </documents>
  </xsl:template>
</xsl:stylesheet>

方式二:用模板匹配(更符合XSLT的设计思想)

如果想更贴合XSLT的“匹配优先”原则,可以用模板来实现,代码更简洁:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 匹配根节点,输出外层的documents元素 -->
  <xsl:template match="/">
    <documents>
      <!-- 应用匹配document的模板 -->
      <xsl:apply-templates select="/process/documents/document"/>
    </documents>
  </xsl:template>

  <!-- 匹配titel不是"Doc1"的document节点,输出目标元素 -->
  <xsl:template match="document[titel != 'Doc1']">
    <document filename="{titel}"/>
  </xsl:template>

  <!-- 匹配titel是"Doc1"的document节点,什么都不输出(过滤掉) -->
  <xsl:template match="document[titel = 'Doc1']"/>
</xsl:stylesheet>

解释一下关键部分:

  • {titel}是属性值模板,可以直接把titel的内容作为属性值,比用xsl:attribute+xsl:value-of更简洁
  • 不管用哪种方式,核心都是选中所有document节点,然后过滤掉titel等于"Doc1"的那个,剩下的输出成你需要的结构

这样处理后,不管你的XML里有多少个document,都会自动过滤掉标题为"Doc1"的文档,输出剩下的内容。

内容的提问来源于stack exchange,提问作者Toitula

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 07:37:31