Как пересчитать позицию, когда копируете шаблон - PullRequest
1 голос
/ 19 мая 2011

Я хочу спросить, как пересчитать положение номера строки и другие данные, когда я копирую шаблон из другого файла XML, если удовлетворяю условию, что код должен быть таким же, как в lookup.xml.

Мои программы выглядят так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>   
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template> 
    <xsl:template match="Line-Item[code = document('lookup.xml')/*/*/code]" />
    <xsl:template match="Line[not(Line-Item/code[not(. = document('lookup.xml')/*/*/code ) ] )]"/>  
</xsl:stylesheet>

XML-файл:

<document>
    <header>
        <remarks>test</remarks>
    </header>
    <Line>
        <Line-Item>
            <lineNumb>1</lineNumb>
            <code>123</code>
            <amount>4</amount>
        </Line-Item>
        <Line-Item>
            <lineNumb>2</lineNumb>
            <code>444</code>
            <amount>2</amount>
        </Line-Item>
        <Line-Item>
            <lineNumb>3</lineNumb>
            <code>321</code>
            <amount>1</amount>
        </Line-Item>
    </Line>
    <summary>
        <total-line>3</total-line>
        <total-amount>7</total-amount>
    </summary>
</document>

Файл Lookup.xml:

<lookup>
    <Codes>
        <code>123</code>
    </Codes>
</lookup>

Мне нужно пересчитать lineNumb в Line-Item, и сводка там итого-линии и общая сумма.

Правильный результат:

<document>
    <header>
        <remarks>test</remarks>
    </header>
    <Line>
        <Line-Item>
            <lineNumb>1</lineNumb>
            <code>444</code>
            <amount>2</amount>
        </Line-Item>
        <Line-Item>
            <lineNumb>2</lineNumb>
            <code>321</code>
            <amount>1</amount>
        </Line-Item>
    </Line>
    <summary>
        <total-line>2</total-line>
        <total-amount>3</total-amount>
    </summary>
</document>

1 Ответ

1 голос
/ 19 мая 2011

Ваша работа почти завершена. Вам нужны только XPath count() и sum(). Чтобы пересчитать lineNumb, я сосчитал все предыдущие родственные элементы, но те, которые соответствуют поисковому коду.

Я думаю, что это должно работать на основе ваших предположений.


XSLT 1.0 протестировано на Saxon-B 9.0.0.4J

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>   

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Line">

        <xsl:copy>
            <xsl:apply-templates select="Line-Item"/>
        </xsl:copy>

        <xsl:variable name="lines" select="count(Line-Item[not(code = document('lookup.xml')/*/*/code)])"/>
        <xsl:variable name="amount" select="sum(Line-Item[not(code = document('lookup.xml')/*/*/code)]/amount)"/>

        <summary>
            <total-line><xsl:value-of select="$lines"/></total-line>
            <total-amount><xsl:value-of select="$amount"/></total-amount>
        </summary>
    </xsl:template>

    <xsl:template match="Line-Item">
        <xsl:copy>
            <lineNumb>
                <xsl:value-of select="count(preceding-sibling::*[not(code = document('lookup.xml')/*/*/code)])+1"/>
            </lineNumb>
            <xsl:copy-of select="code"/>
            <xsl:copy-of select="amount"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Line-Item[code = document('lookup.xml')/*/*/code]|summary" />

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...