每次xsl只迭代一次

时间:2013-06-23 17:45:23

标签: xml xslt foreach

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

但我认为创建子孩子是非常愚蠢的......

此致

3 个答案:

答案 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: ', ., '&#xA;')" />
</xsl:template>

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

答案 1 :(得分:0)

通过反复试验找到解决方案:

<xsl:for-each select="/CV/additions/name">
  <xsl:value-of select="."/>
</xsl:for-each>

答案 2 :(得分:0)

解释的另一部分纯粹是心理上的。英语中的“添加”一词是复数名词,所以你误以为当你选择它时,你会选择几个东西。我确信如果元素被命名为“添加”,你就不会犯这个错误。