0

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

但我认为创建子孩子很愚蠢......

问候

4

3 回答 3

1

您已经找到了解决方案,但就解释而言......

xsl:for-each遍历由 XPath 选择的所有节点。在您最初的尝试中,路径/CV/additions只匹配一个节点,所以它只迭代一次。在您的解决方案中,您使用了/CV/additions/name选择所有三个name元素并遍历它们的路径。

值得注意的xsl:for-each是,通常不鼓励使用 of,而是使用模板,尽管这里对路径的处理遵循相同的原则:

<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>
于 2013-06-23T19:31:51.920 回答
0

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

<xsl:for-each select="/CV/additions/name">
  <xsl:value-of select="."/>
</xsl:for-each>
于 2013-06-23T18:07:25.780 回答
0

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

于 2013-06-23T21:23:20.990 回答