XSLT if语句失败,有多个类似的条目

时间:2015-04-22 00:14:14

标签: xml xslt if-statement xslt-2.0

我在代码中遇到 if 条件时遇到问题。如果我有两组具有相似子树的节点,并在我的代码中放入如果不是条件,则它会使条目失败。

在这里,我试图显示没有包含“imp”“Imp”的条目的条目

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

    <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 not(GSP/RES/R/MT[@N='sc'][contains(@V, 'imp') or contains(@V, 'Imp')])

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

的条目
<R N="1">

如果我保留第一个 if ,那么我没有得到“Some Stuff”标题,其余部分也没有显示。

2 个答案:

答案 0 :(得分:0)

我怀疑你写的时候

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:如果你的上下文错误。你写过

<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']] ...

警告:我实际上并没有尝试找出符合您要求的正确代码,我只是看了一下代码“闻错了”。

答案 1 :(得分:-1)

而不是你已经尝试了

 <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')]))">

我已将你的第一个条件包含在第一个括号中,并且它在我的最后工作