Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt xsl的问题:for-each_Xslt - Fatal编程技术网

Xslt xsl的问题:for-each

Xslt xsl的问题:for-each,xslt,Xslt,我肯定缺少了处理XML文档的一些基本概念。以下是我的源XML: <?xml version="1.0" encoding="ISO-8859-1"?> <Root> <Element>visitorNameAlt</Element> <Element>visitorScore</Element> <Element>visitorTimeouts</Element> <Elemen

我肯定缺少了处理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>

访问者名称ALT
访客分数
探视时间
空白
homeNameAlt
宅基地
家庭超时
空白
时期
可选文本
旗帜
空白
计分标志
赞助商标志
和我的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新手,但已经成功地处理了其他文档

提前谢谢


Bill

您在根标记上循环,而不是元素标记。试试这个:

<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()”

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>


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

将XML文档视为树。现在for-each将尝试根据树结构匹配指定的选择声明式样式的路径。谢谢。这对我很管用。不幸的是,XML文件是处理更复杂的XML文件的两次尝试的第一次尝试的结果。该解决方案处理了作为独立XML文件保存的临时结果,但不适用于整个schmeer。我现在需要评估哪里出了问题,并可能提交另一个问题。但感谢您帮助我克服了这个障碍。注意:我在第一次通过后生成的树片段上使用节点集扩展,所以我认为这不是问题所在。:-)“对于每个根”的意思正是它所说的-处理每个根一次。只有一个根,所以我无法想象for-each的主体将被执行多次。