Подсчет элементов в XML с перекрестной ссылкой - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть XML, который я хотел бы обработать с помощью XSL для подсчета элементов. Я хотел бы посчитать имена терминов, которые имеют тот же родительский концепт / ID, что и записи des c (которые не являются концептами типов), с их атрибутом концепта / ID.

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>

Таким образом, для этого XML программа может рассчитывать имена терминов, используя все элементы des c, которые имеют значение типа атрибута «a», например, и он будет использовать значение # 1 для поиска элемента des c (концепция типа) с элементом ID со значением 1 (потребуется удалить «#») и подсчитать все имена терминов для каждого Концепция, которая соответствует этому идентификатору.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="no"/>

<xsl:template match="/">
    <xsl:apply-templates select="//desc[concept/@ID]"/>
</xsl:template>

<xsl:template match="desc">
    <xsl:variable name="id" select="concept/@ID"/>
    <xsl:variable name="formatId" select="translate(normalize-space(translate($id, '#', ' ')),' ',',')"/>
    <xsl:value-of select="$id"/>
    <xsl:text>: </xsl:text> 
    <xsl:value-of select="count(//desc[@type='concept'][ID = $formatId]/term)"/>
    <xsl:text>, </xsl:text>                  
</xsl:template>
</xsl:stylesheet>

Настройте это в соответствии со своими потребностями. Вывод выглядит так:

#1: 2, #2: 1, 
0 голосов
/ 09 апреля 2020

Не является решением Python, но выберет все термины, которые соответствуют элементу des c типа 'b'. (без счета)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<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[@type != 'concept' and @type != 'a']">

    <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:text>&#xA;</xsl:text>
        </xsl:for-each>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...