我必须遗漏处理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的新手,但已成功处理其他文档。
提前致谢。
比尔
答案 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
个节点。第二个模板匹配这些节点,并输出所需的信息。