循环遍历节点xslt python

时间:2013-06-29 20:04:32

标签: python xslt xpath python-2.7

以下是示例xml:

 <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获取每个节点的文本...我在获取节点titlestatement的文本时没有任何问题但是,当我尝试循环节点时文字我只得到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 

按顺序..有任何建议请! 感谢

1 个答案:

答案 0 :(得分: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>

union构造|将确保按文档顺序处理节点。