Подсчет узлов XML с использованием XSLT, но исключая определенные узлы - PullRequest
1 голос
/ 12 июля 2010

У меня есть следующий XML:

<assessment>
    <section>
        <item name="Item1"/>
        <item name="Item2"/>
        <item name="Item3">
            <attributes>
                <item_references>
                    <item_reference>
                        <attributes>
                            <item name="Item3.1">
                                <item name="Item3.1.1"/>
                            </item>
                        </attributes>
                    </item_reference>
                </item_references>
            </attributes>
        </item>
    </section>
</assessment>

Используя XSLT, я хочу посчитать количество элементов, но не считать те элементы, которые вложены в элементы. В этом случае я хочу считать Item1, Item2 и Item 3, но не Item3.1 или Item3.1.1. Таким образом, в этом случае ответ должен быть 3 (а не 5).

У меня есть следующий код, который подсчитывает элементы, но не пропускает вложенные элементы:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="assessment">
        <xsl:value-of select="count(.//item)"/>
    </xsl:template>
</xsl:stylesheet>

Как я могу изменить этот код, чтобы исключить вложенные элементы?

Ответы [ 2 ]

2 голосов
/ 12 июля 2010

Попробуйте это.

count (.// item [not (ancestor :: item)])

0 голосов
/ 13 июля 2010

Следуя вашей таблице стилей, этот

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="assessment">
        <xsl:value-of select="count(*/item)"/>
    </xsl:template>
</xsl:stylesheet>

Результат:

3

Примечание : Вы также можете сопоставить элемент section.Избегайте нисходящей оси, когда это возможно.

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