Найти узел с максимальным количеством дочерних узлов в XSLT - PullRequest
0 голосов
/ 27 августа 2018

У меня есть следующий XML, и я хочу получить Id и статус AccountData с максимальным количеством совпадений. Поэтому результат должен содержать id = 1000349827 и status = trust.Как я могу сделать это в XSLT v1:

<Body>
<LookupCustomersRs>
    <CustomersData>
    <CustomerData objectID="0" objectStatus="10">
        <AccountData objectID="0" objectStatus="1" objectType="ESIA_ACCOUNT">
            <Id>1000349826</Id>
            <status>trusted</status>
            <Matches>
                <Match>doc</Match>
                <Match>mobile</Match>
            </Matches>
        </AccountData>
        <AccountData objectID="0" objectStatus="1" objectType="ESIA_ACCOUNT">
            <Id>1000349827</Id>
            <status>trusted</status>
            <Matches>
                <Match>doc</Match>
                <Match>snils</Match>
                <Match>mobile</Match>
                <Match>mobile2</Match>
            </Matches>
        </AccountData>
        <AccountData objectID="0" objectStatus="1" objectType="ESIA_ACCOUNT">
            <Id>1000349828</Id>
            <status>trusted</status>
            <Matches>
                <Match>doc</Match>
            </Matches>
        </AccountData>
    </CustomerData>
    </CustomersData>
</LookupCustomersRs>

1 Ответ

0 голосов
/ 13 сентября 2018

Решение по ответу Мартина:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="text" indent="yes"/>
    <xsl:template match="/">
      <xsl:apply-templates select="Body/LookupCustomersRs/CustomersData/CustomerData/AccountData">
        <xsl:sort select="count(Matches/Match)" order="descending"/>
      </xsl:apply-templates>
    </xsl:template>
  <xsl:template match="Body/LookupCustomersRs/CustomersData/CustomerData/AccountData">
    <xsl:if test="position()=1">
      <xsl:text>Id=</xsl:text>
      <xsl:value-of select="Id"/>
      <xsl:text>,</xsl:text>
      <xsl:text>status=</xsl:text>
      <xsl:value-of select="status"/>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...