XSLT if 语句因多个相似条目而失败

XSLT if statement failing with multiple similar entries

我在代码中遇到 if 条件问题。如果我有两组具有相似子树的节点,并在我的代码中放置一个 if not 条件,那么它会使条目失败。

在这里,我试图显示不包含 "imp""Imp"[= 的条目35=]

这是我实际代码的简化版本,但我遇到了问题

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" indent="yes" omit-xml-declaration="no" media-type="application/xml" standalone="yes"/>
  <xsl:template match="/">
    <xsl:if test="GSP/RES/R/MT[@N='fe'][@V='true'] and not(GSP/RES/R/MT[@N='sc'][contains(@V, 'imp') or contains(@V, 'Imp')])">
      <menuSection>
        <header>
          <horizontalDivider alignment="center">
            <title>Some Stuff </title>
          </horizontalDivider>
        </header>
        <items>
      <xsl:for-each select="GSP/RES/R">
      <xsl:if test="GSP/RES/R/MT[@N='fe'][@V='true'] and not(GSP/RES/R/MT[@N='sc'][contains(@V, 'imp') or contains(@V, 'Imp')])">
        --some stuff
      </xsl:if>
      </xsl:for-each>
        </items>
      </menuSection>
  </xsl:if>
</xsl:template>
</xsl:stylesheet>

这是我的 xml

的简化版本
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<GSP VER="3.2">
    <RES SN="1" EN="2">
        <R N="1">
            <MT N="fe" V="true"/>
            <MT N="sc" V="low-pri"/>
        </R>
        <R N="2">
            <MT N="fe" V="true"/>
            <MT N="showcode" V="imp"/>
        </R>
    </RES>
</GSP>

如果我删除第一个的 and 条件 if

and not(GSP/RES/R/MT[@N='sc'][contains(@V, 'imp') or contains(@V, 'Imp')])

然后第二个 if 工作正常并向我显示

的条目
<R N="1">

如果我保持第一个 if 不变,那么我就不会得到 "Some Stuff" header其余的也没有显示。

而不是你试过的这个

 <xsl:if test="GSP/RES/R/MT[@N='fe'][@V='true'] and not(GSP/RES/R/MT[@N='sc'][contains(@V, 'imp') or contains(@V, 'Imp')])">

试试这个

<xsl:if test="(GSP/RES/R/MT[@N='fe'][@V='true']) and (not(GSP/RES/R/MT[@N='sc'][contains(@V, 'imp') or contains(@V, 'Imp')]))">

我已将您的第一个条件包含在第一个括号中,它对我有效

我怀疑你写的时候

test="GSP/RES/R/MT[X] and not(GSP/RES/R/MT[Y])"

您实际上希望两个条件都应用于同一个 MT 节点,而按照您编写的方式,如果有一个 MT 节点 X 为真,而没有 MT 节点 Y 为真,则测试将通过。

所以我怀疑你想要

test="GSP/RES/R/MT[X and not(Y)]"

在你的第二个 xsl:if 中,你的上下文有误。你写了

<xsl:for-each select="GSP/RES/R">
      <xsl:if test="GSP/RES/R/MT[@N='fe'][@V='true'] ...

但是 xsl:if 的上下文是 R 元素,并且 R 元素没有 GSP 子元素。您在这里的意图可能是

<xsl:for-each select="GSP/RES/R">
      <xsl:if test="MT[@N='fe'][@V='true'] ...

或更简单地说

<xsl:for-each select="GSP/RES/R[MT[@N='fe'][@V='true']] ...

警告:我实际上并没有尝试根据您的要求计算出正确的代码,我只是查看了您的代码所在的位置 "smells wrong"。