XSLT问题:筛选1970年出生的ime节点并获取上级imeK节点
问题:无法获取符合条件的zaposlen节点对应的上级imeK节点
需求:筛选出datum_rojstva包含1970的ime节点,同时获取该节点对应的上级imeK节点,但现有XSLT代码无法正确选中上级的imeK节点。
现有XSLT代码
<xsl:for-each select="seznam/kraj/zaposlen"> <xsl:if test="contains(datum_rojstva, '1970')"> <xsl:value-of select="concat(ime,' ',../imeK"/><br/> </xsl:if> </xsl:for-each>
对应的XML代码
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="test.xsl" type="text/xsl"?> <seznam> <kraj> <imeK>Maribor</imeK> <zaposlen> <DS>3213212</DS> <ime>Ana</ime> <priimek>Bregar</priimek> <datum_rojstva>1984-01-01</datum_rojstva> <placa>1932.60</placa> </zaposlen> <zaposlen> <DS>1231232</DS> <ime>Vesna</ime> <priimek>Lampret</priimek> <datum_rojstva>1970-01-01</datum_rojstva> <placa>1650.55</placa> </zaposlen> </kraj> <kraj> <imeK>Ljubljana</imeK> <zaposlen> <DS>1234567</DS> <ime>Jana</ime> <priimek>Novak</priimek> <datum_rojstva>1990-10-20</datum_rojstva> <placa>1000.35</placa> </zaposlen> <zaposlen> <DS>3334445</DS> <ime>Peter</ime> <priimek>Kos</priimek> <datum_rojstva>1970-11-15</datum_rojstva> <placa>1732.35</placa> </zaposlen> <zaposlen> <DS>9876543</DS> <ime>Jure</ime> <priimek>Erlah</priimek> <datum_rojstva>1978-12-15</datum_rojstva> <placa>2038.35</placa> </zaposlen> </kraj> </seznam>
错误原因分析
现有代码中../imeK的路径是正确的——当前上下文是zaposlen节点,../指向其父节点kraj,可以正常访问imeK。问题出在**concat函数缺少闭合括号**,导致XSLT解析失败,无法执行后续逻辑。
修正后的XSLT代码
基础修复版本
<xsl:for-each select="seznam/kraj/zaposlen"> <xsl:if test="contains(datum_rojstva, '1970')"> <xsl:value-of select="concat(ime,' ',../imeK)"/><br/> </xsl:if> </xsl:for-each>
优化版本(整合过滤条件)
将过滤条件直接放到xsl:for-each的select属性中,减少冗余的xsl:if,代码更简洁高效:
<xsl:for-each select="seznam/kraj/zaposlen[contains(datum_rojstva, '1970')]"> <xsl:value-of select="concat(ime,' ',../imeK)"/><br/> </xsl:for-each>
效果说明
修正后的代码会输出:
Vesna Maribor Peter Ljubljana
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

