Предшествующий брат в XML - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть такие данные 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 ]

1 голос
/ 05 апреля 2011

в моем коде xsl я внутри узла суммы, и я хочу, чтобы получить значение тег «данные», который является родителем этого количество тегов

Обратите внимание, что элемент data является дочерним по отношению к items (amount прародитель) в вашем образце.

Используйте это:

../../data

Также это:

preceding::data[1]

Но необходимо гарантировать, что в каждом items.

будет по одному data.

Если вы действительно хотите использовать preceding-sibling ось, тогда:

../preceding-sibling::data
1 голос
/ 05 апреля 2011

Из контекста элемента 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>
...