Xml xsl for each只迭代一次
我的XML的简化结构:Xml xsl for each只迭代一次,xml,xslt,foreach,Xml,Xslt,Foreach,我的XML的简化结构: <CV> <info> <firstname>Sam</firstname> <lastname>Smith</lastname> <birthday>19/08/1978</birthday> </info> <additions> <name>japan language course<
<CV>
<info>
<firstname>Sam</firstname>
<lastname>Smith</lastname>
<birthday>19/08/1978</birthday>
</info>
<additions>
<name>japan language course</name>
<name>skipper course</name>
</additions>
<interests>
<name>cycling</name>
<name>runing</name>
<name>surfing</name>
</interests>
</CV>
山姆
史密斯
19/08/1978
日本语言课程
船长课程
骑脚踏车兜风
运行
冲浪
我在使用xsl对每个添加项和兴趣项进行迭代时遇到了一个问题:
<xsl:for-each select="/CV/additions">
<xsl:value-of select="name"/>
</xsl:for-each>
它只显示“日本语言课程”和“自行车”
结构是否可能不正确?解决我的问题的最简单方法是改变:
<interests>
<name>cycling</name>
<name>runing</name>
<name>surfing</name>
</interests>
骑脚踏车兜风
运行
冲浪
进入:
骑脚踏车兜风
运行
冲浪
但我认为创造子孩子是相当愚蠢的
关于通过反复试验找到解决方案:
<xsl:for-each select="/CV/additions/name">
<xsl:value-of select="."/>
</xsl:for-each>
您已经找到了解决方案,但就解释而言
xsl:for each
遍历XPath选择的所有节点。在初始尝试中,路径/CV/additions
仅匹配一个节点,因此它只迭代一次。在您的解决方案中,您使用了路径/CV/additions/name
,该路径选择所有三个name
元素并对它们进行迭代
值得注意的是,通常不鼓励为每个使用xsl:for-each,而支持使用模板,尽管此处对路径的处理遵循相同的原则:
<xsl:template match="/">
<xsl:apply-templates select="/CV/additions/name" />
<xsl:apply-templates select="/CV/interests/name" />
</xsl:template>
<xsl:template match="additions/name">
<xsl:value-of select="concat('Addition: ', ., '
')" />
</xsl:template>
<xsl:template match="interests/name">
<xsl:value-of select="concat('Interest: ', ., '
')" />
</xsl:template>
解释的另一部分纯粹是心理上的。英语中的“additions”是一个复数名词,所以你被误导,以为当你选择它时,你选择了几个东西。我确信,如果元素被命名为“加法”,您就不会犯这个错误
<xsl:template match="/">
<xsl:apply-templates select="/CV/additions/name" />
<xsl:apply-templates select="/CV/interests/name" />
</xsl:template>
<xsl:template match="additions/name">
<xsl:value-of select="concat('Addition: ', ., '
')" />
</xsl:template>
<xsl:template match="interests/name">
<xsl:value-of select="concat('Interest: ', ., '
')" />
</xsl:template>