麻烦xsl:for-each

时间:2012-08-09 18:15:59

标签: xslt

我必须遗漏处理XML文档的一些基本概念。这是我的源XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Root>
  <Element>visitorNameAlt</Element>
  <Element>visitorScore</Element>
  <Element>visitorTimeouts</Element>
  <Element>Blank</Element>
  <Element>homeNameAlt</Element>
  <Element>homeScore</Element>
  <Element>homeTimeouts</Element>
  <Element>Blank</Element>
  <Element>period</Element>
  <Element>optionalText</Element>
  <Element>flag</Element>
  <Element>Blank</Element>
  <Element>scoreLogo</Element>
  <Element>sponsorLogo</Element>
</Root>

我的XSL样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" indent="yes"/>

<xsl:template match="/">
    <xsl:for-each select="/Root">
        <xsl:value-of select="position()"/>
        <xsl:value-of select="Element"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我想要的只是从源XML文档中获取“Element”名称及其相对位置。

我的输出只是“1”,后跟第一个元素,仅此而已。

我是XSLT的新手,但已成功处理其他文档。

提前致谢。

比尔

2 个答案:

答案 0 :(得分:1)

您循环使用Root标记,而不是元素标记。试试这个:

<xsl:template match="/">
  <xsl:for-each select="/Root/Element">
     <xsl:value-of select="position()"/>
     <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:template>

请注意,您必须将select的第二个值更改为“。”或“text()”。

答案 1 :(得分:0)

XSLT不是命令式编程语言。 XSLT处理器依次抓取每个元素并尝试将其与样式表匹配。写这个的惯用方法是没有 a for-each:

<xsl:template match="/Root">
    <xsl:apply-templates select="Element"/>
</xsl:template>

<xsl:template match="Element">
    <xsl:value-of select="position()"/>
    <xsl:value-of select="."/>
</xsl:template>

第一个模板与根匹配,并告诉处理器将样式表应用于Element内的所有Root个节点。第二个模板匹配这些节点,并输出所需的信息。