简化我的XML结构:
<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>
我在使用xsl for-each添加和兴趣时出现了迭代问题:
<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>
成:
<interests>
<interest>
<name>cycling</name>
</interest>
<interest>
<name>runing</name>
</interest>
<interest>
<name>surfing</name>
</interest>
</interests>
但我认为创建子孩子是非常愚蠢的......
此致
答案 0 :(得分:1)
你找到了解决方案,但就解释而言......
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>
答案 1 :(得分:0)
通过反复试验找到解决方案:
<xsl:for-each select="/CV/additions/name">
<xsl:value-of select="."/>
</xsl:for-each>
答案 2 :(得分:0)
解释的另一部分纯粹是心理上的。英语中的“添加”一词是复数名词,所以你误以为当你选择它时,你会选择几个东西。我确信如果元素被命名为“添加”,你就不会犯这个错误。