2

我一定错过了处理 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 文档中提取“元素”名称,并将它们的相对位置放在前面。

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

我是 XSLT 的新手,但已经使用 for-each 成功处理了其他文档。

提前致谢。

账单

4

2 回答 2

1

您正在循环 Root 标签,而不是 Element 标签。试试这个:

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

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

于 2012-08-09T18:20:59.030 回答
0

XSLT 不是命令式编程语言。XSLT 处理器依次抓取每个元素并尝试将其与您的样式表相匹配。写这个的惯用方法是没有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>

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

于 2012-08-09T18:24:18.517 回答