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"。
我在代码中遇到 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"。