Использование перекрестной ссылки XSL для подсчета совпадающих узлов - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть таблица стилей XSL, в которой с помощью клавиши выбираются XML узлы. Он выбирает термин / информация / имя элементов des c с типом "concept", которые имеют идентификатор, соответствующий атрибуту concept / @ ID элемента des c, который не имеет тип атрибута "concept" , То, что я сейчас пытаюсь сделать, - это получить счетчик всех терминов с идентификатором родственного элемента, который соответствует элементу des c с указанным типом c, который не является концепцией. Например, я хотел бы иметь возможность подсчитать, сколько терминов связано с элементом «a» типа des c, в данном случае это будет 2 термина.

XML

<rdf>
    <desc type = "a">
        <concept ID = "#1"/>
    </desc>

    <desc type = "b">
        <concept ID = "#2"/>
    </desc>

    <desc type = "concept">
        <ID>1</ID>
        <term>
            <info>
                <name>apple</name>
                <ID>1</ID>
            </info>
        </term>
        <term>
            <info>
                <name>pear</name>
                <ID>2</ID>
            </info>
        </term>
    </desc>

    <desc type = "concept">
        <ID>2</ID>
        <term>
            <info>
                <name>chocolate</name>
                <ID>1</ID>
            </info>
        </term>
    </desc>
</rdf>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:key name = "terms" match = "desc[@type = 'concept']" use = "ID"/>


    <xsl:template match="/">
        <xsl:apply-templates select = "rdf/desc[@type != 'concept' and @type != 'a']"/>
    </xsl:template>

    <xsl:template match = "desc">

        <xsl:variable name = "test" select = "key('terms', substring(concept/@ID, 2))"/>
        <xsl:for-each select="$test/term/info">
            <xsl:value-of select="name/text()"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Эта таблица стилей в настоящее время выводит название терминов, которые соответствуют элементу des c с типом "b", который является "шоколадом". Любая помощь в том, как я могу получить количество терминов, а также название было бы полезно.

1 Ответ

0 голосов
/ 09 апреля 2020

Рассмотрим следующий пример:

XSLT 1.0

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

<xsl:key name="concept" match="desc[@type = 'concept']" use="ID"/>

<xsl:template match="/rdf">
    <root>
        <xsl:for-each select="desc[@type != 'concept']">
            <xsl:variable name="terms" select="key('concept', substring(concept/@ID, 2))/term"/>
            <desc count="{count($terms)}">
                <xsl:copy-of select="$terms/info/name"/>
            </desc>
        </xsl:for-each>    
    </root>
</xsl:template>

</xsl:stylesheet>

Результат

<root>
  <desc count="2">
    <name>apple</name>
    <name>pear</name>
  </desc>
  <desc count="1">
    <name>chocolate</name>
  </desc>
</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...