XSLT1.0(MSXML6)仅当REC_CARB_MRKR节点存在时输出文本块
XSLT 1.0 条件输出模块实现方案
核心逻辑
XSLT 1.0 配合MSXML 6引擎时,可先通过变量筛选出所有带REC_CARB_MRKR子节点的有效LAYER节点,再基于该变量的非空判断决定是否输出整个WELLCURVE模块内容,从根源上避免无有效数据时输出无意义的头尾固定文本。
具体改造步骤
- 第一步:在输出WELLCURVE模块的位置前置定义筛选变量,直接匹配符合要求的有效节点
<xsl:variable name="validLayers" select="/NODE1/LAYERS/LAYER[REC_CARB_MRKR]"/> - 第二步:将原有WELLCURVE模块下的所有内容(头部固定文本、LAYER节点遍历逻辑、尾部固定文本)全部包裹在条件判断块内,XSLT 1.0中节点集非空时会自动判定为布尔真
<xsl:if test="$validLayers"> <!-- 这里放WELLCURVE模块的全部原有输出逻辑 --> </xsl:if> - 第三步:优化遍历逻辑,直接遍历提前筛选好的
$validLayers变量输出REC数据行,无需在循环内重复判断子节点是否存在,减少冗余计算。
完整参考代码片段
<xsl:template match="/"> <!-- 其余原有业务逻辑保持不变 --> <!-- WELLCURVE模块 增加前置存在性判断 --> <xsl:variable name="validCarbMarkerLayers" select="/NODE1/LAYERS/LAYER[REC_CARB_MRKR]"/> <xsl:if test="$validCarbMarkerLayers"> <!-- 输出头部固定文本 --> <xsl:text>SOME TEXT Options </xsl:text> <!-- 遍历输出有效REC数据行 --> <xsl:for-each select="$validCarbMarkerLayers"> <!-- 替换为你原有输出REC行的具体字段取值逻辑 --> <xsl:value-of select="REC_CARB_MRKR"/> <xsl:text>
</xsl:text> </xsl:for-each> <!-- 输出尾部固定文本 --> <xsl:text>END_CURVE END </xsl:text> </xsl:if> <!-- 其余原有业务逻辑保持不变 --> </xsl:template>
注意事项
路径写法优先使用从根节点出发的绝对路径
/NODE1/LAYERS/LAYER[REC_CARB_MRKR],不要使用//LAYER[REC_CARB_MRKR]这类全文档扫描写法,既能避免匹配到文档其他位置的同名节点,也能提升MSXML 6引擎的解析执行效率。
内容的提问来源于stack exchange,提问作者lilaaffe
相关产品推荐
相关产品推荐

