我在代码中遇到 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”标题,其余部分也没有显示。
答案 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')]))">
我已将你的第一个条件包含在第一个括号中,并且它在我的最后工作