如何使用xsl循环遍历xml元素

时间:2011-07-31 15:36:27

标签: xml loops xslt

我在xml中有这样的场景:

<ViewFields>
  <FieldRef Name="Planing Status" />
  <FieldRef Name="Resource Status" />
  <FieldRef Name="Development Status" />
  <FieldRef Name="Testing Status" />
</ViewStatus>

我必须在xsl中循环使用,我在下面跟着:

<xsl:template name="FieldRef_body.Status" match="FieldRef[@Name=/ViewFields/FieldRef[1]]" mode="body">

它不会归还任何东西 @Name变量我在本节中使用了几个地方。我想通过循环将FieldRef值赋给@Name变量。

1 个答案:

答案 0 :(得分:2)

<xsl:template name="FieldRef_body.Status" 
     match="FieldRef[@Name=/ViewFields/FieldRef[1]]" mode="body"> 

这里有两点需要注意

  1. match属性包含一个XPath表达式,当应用于提供的XML文档时,会选择 no 节点。它应该选择名为FieldRef的元素,其Name属性的字符串值等于FieldRef top元素的第一个ViewFields子元素的字符串值。但是,XML文档中的FieldRef个元素都没有任何(非空)字符串值。另一方面,所有Name属性的字符串值都是非空的。我的猜测是你想要:match="FieldRef[@Name=/ViewFields/FieldRef[1]/@Name]"

  2. 如果模式与当前模式不同,XSLT处理器不会将(非匿名)模式中的任何模板视为选择

  3. 由于XSLT 1.0(以及XSLT 2.0)中的初始模式是空(匿名)模式,因此考虑选择非匿名模式的模板的唯一方法是在{{{ 1}}指令。

    此转化

    <xsl:apply-templates>

    生成此结果,表明已选择模板进行处理

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="/">
         <xsl:apply-templates select="*/*" mode="body"/>
     </xsl:template>
    
     <xsl:template match="FieldRef[@Name=/ViewFields/FieldRef[1]/@Name]"
                   mode="body">
      <xsl:value-of select="@Name"/>
     </xsl:template>
    </xsl:stylesheet>