在XML之前的兄弟姐妹

时间:2011-04-05 17:38:47

标签: xpath xalan siblings

我有这样的XML数据:

<items>
<data>2</data>  
<listElement>       
    <amounts>           
        <period_id>1</period_id>            
        <amount>5</amount>
    </amounts>
    <amounts>
        <period_id>2</period_id>            
        <amount>6</amount>
    </amounts>
    <amounts>           
        <period_id>3</period_id>            
        <amount>7</amount>
    </amounts>
    <amounts>           
        <period_id>8</period_id>            
        <amount>89</amount>
    </amounts>
</listElement>
</items>
<items>
<data></data>   
<listElement>       
    <amounts>           
        <period_id>4</period_id>            
        <amount>55</amount>
    </amounts>
    <amounts>
        <period_id>5</period_id>            
        <amount>9</amount>
    </amounts>
    <amounts>           
        <period_id>6</period_id>            
        <amount>20</amount>
    </amounts>
    <amounts>           
        <period_id>7</period_id>            
        <amount>80</amount>
    </amounts>
</listElement>
</items>

在我的xsl代码中,我在一个节点数量内,我想获得标签“data”的值,该数据是该标签的父级数量?

我正在使用xalan和xslt1.0以及apache fop

注意:我尝试过:

<xsl:value-of select="preceding-sibling::*data[normalize-space(.)]">
</xsl:value-of> 

但仍然错了。

2 个答案:

答案 0 :(得分:1)

来自amounts元素的上下文:

../preceding-sibling::data[1]

以下样式表将前面的data元素复制到每个amounts元素中,而文档的其余部分保持不变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="amounts">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
            <xsl:copy-of select="../preceding-sibling::data[1]" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

应用于源文档时,它会生成以下输出:

<root>
    <items>
        <data>2</data>
        <listElement>
            <amounts>
                <period_id>1</period_id>
                <amount>5</amount>
                <data>2</data>
            </amounts>
            <amounts>
                <period_id>2</period_id>
                <amount>6</amount>
                <data>2</data>
            </amounts>
            <amounts>
                <period_id>3</period_id>
                <amount>7</amount>
                <data>2</data>
            </amounts>
            <amounts>
                <period_id>8</period_id>
                <amount>89</amount>
                <data>2</data>
            </amounts>
        </listElement>
    </items>
    <items>
        <data />
        <listElement>
            <amounts>
                <period_id>4</period_id>
                <amount>55</amount>
                <data />
            </amounts>
            <amounts>
                <period_id>5</period_id>
                <amount>9</amount>
                <data />
            </amounts>
            <amounts>
                <period_id>6</period_id>
                <amount>20</amount>
                <data />
            </amounts>
            <amounts>
                <period_id>7</period_id>
                <amount>80</amount>
                <data />
            </amounts>
        </listElement>
    </items>
</root>

答案 1 :(得分:1)

  

在我的xsl代码中我在一个节点内   金额,我想得到的价值   标签“data”谁是其父级   标签金额

请注意,data元素是您样本中itemsamount祖父母)的孩子。

使用此:

../../data

还有:

preceding::data[1]

但必须保证每dataitems一个。{/ p>

如果你真的想使用preceding-sibling轴,那么:

../preceding-sibling::data