2013-06-29 163 views
0

以下是示例XML:通过节点XSLT蟒蛇循环

<root> 
    <slide name="abc.xml" nav_info="foo" nav_lvl_1="foobar" nav_lvl_2="foobarz"> 
     <title>a</title> 
     <Introduction> 
      <para>b</para> 
     </Introduction> 
     <Text> 
      <header>c</header> 
      <para>d</para> 
      <header>e</header> 
      <para>f</para> 
      <header>g</header> 
      <para>h</para> 
     </Text> 
     <Statement> 
      <para>i</para> 
     </Statement> 
    </slide> 
</root> 

我必须使用XSLT来获取每个节点的文字...我没有得到节点title的文本的任何问题, statement但是,当我尝试循环节点文本时,我只得到第一个headerpara。为了更好地理解,我正在做什么!

<xsl:choose> 
    <xsl:when test="@nav_info='foo'"> 
     <xsl:for-each select="Text"> 
      <xsl:if test="header"> 
        <xsl:value-of select="header"> 
      </xsl:if 
      <xsl:if test="para"> 
        <xsl:value-of select="para"> 
      </xsl:if 
     </xsl:for-each> 
    </xsl:when> 
</xsl:choose> 

Thsi给中小企业的输出:

cd 预计输出...

c d e f g h 

在order..Any建议请! 谢谢

回答

2

因为您使用的是XSLT 1.0,所以<xsl:value-of select="header"/>只返回第一个值。

您可能只需要做到以下几点,通过<Text>所有的孩子走:

<xsl:when test="@nav_info='foo'"> 
    <xsl:for-each select="Text/*"> 
     <xsl:value-of select="."> 
    </xsl:for-each> 
</xsl:when> 

有没有需要检查的单个元素。

如果有比那些名为<header><para>其他元素的风险,然后使用:

<xsl:when test="@nav_info='foo'"> 
    <xsl:for-each select="Text/header | Text/para"> 
     <xsl:value-of select="."> 
    </xsl:for-each> 
</xsl:when> 

工会构建|将确保您的节点在文档顺序处理。

+0

谢谢霍尔曼先生..我同意上面的...我有一个扩展问题。如你所说,我需要通过孩子,但是,我必须理清输出,即在真正的执行我的代码我必须在转换过程中将头和段的值写入不同的节点。我必须一次检查一个条件..就像它是'文本/头'做些事情,或者如果它是'文本/段'做一些事情..我如何在xslt中实现这个? – Sangamesh

+0

然后你不会使用'',而是可以用''替换'并且为了处理每一个的存在并在输出中构建你需要的节点,有''和''。 –

+0

工作非常感谢你! – Sangamesh