Xml xsl for each只迭代一次

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<

我的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>

山姆
史密斯
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: ', ., '&#xA;')" />
</xsl:template>

<xsl:template match="interests/name">
  <xsl:value-of select="concat('Interest: ', ., '&#xA;')" />
</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: ', ., '&#xA;')" />
</xsl:template>

<xsl:template match="interests/name">
  <xsl:value-of select="concat('Interest: ', ., '&#xA;')" />
</xsl:template>