Xml XSLT:如果满足多个条件,则只为每个主体运行一次

Xml XSLT:如果满足多个条件,则只为每个主体运行一次,xml,xslt,Xml,Xslt,我是XSLT新手,必须对现有XSLT文件进行一些更改 我有以下示例xml: <?xml version="1.0" encoding="utf-8"?> <Item> <SubItems> <SubItem> <InnerItem> <ValueToSearch>XYZ</ValueToSearch> <Level>0</Level>

我是XSLT新手,必须对现有XSLT文件进行一些更改

我有以下示例xml:

<?xml version="1.0" encoding="utf-8"?>
<Item>
  <SubItems>
    <SubItem>
      <InnerItem>
        <ValueToSearch>XYZ</ValueToSearch>
        <Level>0</Level>
        <InnerItem>
          <ValueToSearch>Value1</ValueToSearch>
          <Level>1</Level>
          <InnerItem>
            <ValueToSearch>ABC</ValueToSearch>
            <Level>2</Level>
            <InnerItem>
              <ValueToSearch>Value2</ValueToSearch>
              <Level>3</Level>
            </InnerItem>
          </InnerItem>
        </InnerItem>
      </InnerItem>
      <InnerItem>
        <ValueToSearch>IJK</ValueToSearch>
        <Level>0</Level>
      </InnerItem>
      <InnerItem>
        <ValueToSearch>Value3</ValueToSearch>
        <Level>0</Level>
        <InnerItem>
          <ValueToSearch>HYT</ValueToSearch>
          <Level>1</Level>
        </InnerItem>
      </InnerItem>
    </SubItem>
  </SubItems>
</Item>
预期产出:

<?xml version="1.0" encoding="utf-8"?>
<ValueToSearch>Value1</ValueToSearch>

我的要求是,如果找到了匹配值,只需通过添加另一个xsl:if来对每个标记只运行一次for的主体,该xsl:if将对所有匹配值只满足一次。我知道没有办法打破XSLT中的循环,但是有没有一种更简单的方法来实现我在这里要做的事情呢?

听起来好像您只想处理

<xsl:for-each select="(.//InnerItem[contains( concat(' ', $List, ' '), concat(' ', ValueToSearch , ' '))])[1]">

您能否编辑问题以显示您在此处实际期望的输出?目前,xsl:for-each将返回与列表匹配的所有InnerItem节点,但听起来这不是您想要的。谢谢。@TimC用当前和预期的输出编辑了这个问题。您的实际XML是否包含多个子项元素?如果是,您想返回每个子项中的第一个值,还是整个文档中的第一个值?@TimC是的,事实上,我在从实际数据创建示例XML数据时遗漏了问题中的这一部分,我想整体检查第一个匹配值,而不是每个,检查:这不起作用,仍然获取所有项。我正在使用MSXSL作为XSLT处理器,也许有不同的方法从MSXSL的for-each循环中获取第一项?编辑:刚刚检查了位置,所有值都是1。在我的建议中,我只得到一个项目作为输出。我的实际数据中有多个标记,返回多个值,错过了这一部分,抱歉。选中:@seadrag0n,则需要删除嵌套的for each并使用单个。
<?xml version="1.0" encoding="utf-8"?>
<ValueToSearch>Value1</ValueToSearch>
<xsl:for-each select="(.//InnerItem[contains( concat(' ', $List, ' '), concat(' ', ValueToSearch , ' '))])[1]">
<xsl:for-each select="(//InnerItem[contains( concat(' ', $List, ' '), concat(' ', ValueToSearch , ' '))])[1]">
        <Value>
          <xsl:value-of select="ValueToSearch"/>
        </Value>
</xsl:for-each>