XSLT Нужно подсчитать количество узлов, где число в родительском узле больше 1 - PullRequest
0 голосов
/ 17 ноября 2018

Учитывая приведенный ниже упрощенный XML, мне нужно подсчитать количество узлов, где в / root / a / находится более 1 узла. Поэтому, несмотря на то, что в общей сложности 8 узлов, правильный ответ для меня - 3, поскольку первый и последний / root / a имеют более 1,3. У меня здесь xslt просто даст мне значение 8. Я безуспешно смотрел на использование клавиш, функции положения и т. Д. ... но я думаю, что, возможно, есть более простые ответы. Спасибо за любую помощь.

<root>
    <a>
        <b>
            <c>valuex</c>
        </b>
        <b>
            <c>valuey</c>
        </b>
    </a>
    <a>
        <b>
            <c>valuez</c>
        </b>
    </a>
    <a>
        <b>
            <c>valuex</c>
        </b>
    </a>
    <a>
        <b>
            <c>valuex</c>
        </b>
    </a>
    <a>
        <b>
            <c>valuex</c>
        </b>
        <b>
            <c>valuey</c>
        </b>
        <b>
            <c>valuey</c>
        </b>
    </a>
    <a>
    </a>
</root>

Моя таблица стилей

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:variable name="addCount">
            <xsl:choose>
                <xsl:when test="/root/a/b">
                    <xsl:value-of select="count(/root/a/b)"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="0"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:value-of select="$addCount"/>
    </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Если я правильно понимаю ваше разъяснение (и это большое, если!), Вы хотите сделать:

<xsl:template match="/root">
    <xsl:variable name="a" select="a[count(b) &gt; 1]" />
    <xsl:value-of select="count($a/b) - count($a)"/>        
</xsl:template>

, которое можно сократить до:

<xsl:template match="/root">
    <xsl:value-of select="count(a/b[position() != 1])"/>   
</xsl:template>
0 голосов
/ 17 ноября 2018

Исходя из вашего комментария, звучит так, как будто вы хотите найти количество элементов b, которые являются потомками /root/a, но не являются первым элементом b под каждым из элементов a.

Вы можете использовать следующее, чтобы выбрать все элементы b, которые являются потомками /root/a и исключить первые b из каждого набора:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <xsl:template match="/">
        <xsl:value-of select="count(/root/a/b[position() > 1])"/>        
    </xsl:template>
</xsl:stylesheet>

Вы также можетеиспользуйте следующее, чтобы получить количество всех элементов b, которые имеют preceding-sibling, то есть элемент b:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <xsl:template match="/">
        <xsl:value-of select="count(/root/a/b[preceding-sibling::b])"/>        
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...