xslt - XSLT 检查是否发生在 for-each 中并使用该信息
问题描述
我没有办法解决这个问题,因为我无法在 XSLT 中更改变量的值。希望您可以为以下问题提供适当的方法:
这是一个示例 xml-node,我将引用它来解释问题:
<information>
<uselessNode1></uselessNode1>
<uselessNode2></uselessNode2>
<importantNode></importantNode>
</information>
我这里本质上需要的是遍历信息节点的所有子节点。importantNode 是可选的,我要检测的是该节点是否存在。如果重要节点在那里,它将在 for-each 循环中处理,一切都很好。如果没有 importandNode,我必须证明它在 for-each 循环之外不存在。
因此,如果在信息节点的模板中具有以下 for-each 循环:
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="not( name() = 'importantNode')">
USELESS
</xsl:when>
<xsl:otherwise>
IMPORTANT
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
输出是“无用无用的重要”。如果重要节点不存在,则输出为“无用无用”。我实际上需要的是一个提示,而不是“无用无用”,它表明重要节点不存在,例如“无用无用 IMPORTANT_MISSING”。
我尝试在 for-each 循环中设置一个变量,如果进入 -case 并尝试在 for-each 循环之外检查它会引发错误,即变量 $importantFound 未声明或超出其范围。我虽然在 for-each 循环之前声明它会有所帮助。由于我不能在 for-each 循环之前声明变量并在循环内部的 else 情况下更改它的值,我不知道如何解决这个困境。
我希望对我的问题的解释足够清楚,可以理解。谢谢大家。
解决方案
如果没有 importandNode,我必须证明它在 for-each 循环之外不存在。
那么为什么你不能做到这一点 - 例如:
<xsl:template match="information">
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="not(self::importantNode)">USELESS </xsl:when>
<xsl:otherwise>IMPORTANT </xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:if test="not(importantNode)">IMPORTANT_MISSING</xsl:if>
</xsl:template>
推荐阅读
- docker - docker 系统 df 磁盘使用情况与实际显示的差异
- php - PHP没有在使用Debian 8的nginx上运行
- ios - Swift iOS - 如何排列子层位置以匹配按钮文本的中心
- node.js - 从 Node.js 中的流生成 ffmpeg 缩略图
- c# - C# TimeZoneInfo.ConvertTime 结果不正确
- python - URL 模式和视图
- java - 达到maxLength后如何更改最后一个数字
- python - 使用命令行参数打开 Python 文件
- java - redirect_uri 中的 Spring OAuth2 和查询字符串参数
- c++ - 是否有可能拥有带有移动操作的类型,这些类型会放入容器中?