Нужно получить различные элементы через XSLT - PullRequest
1 голос
/ 28 сентября 2011

У меня есть список элементов таблицы в элементе с именем Query, который может дублироваться, мне нужно выбрать отдельные элементы таблицы (не его значение, а само имя тега / элемента.

/ShopArea/Connection/Query/* перечисляет имена таблицвключая дубликаты.

Ниже приведен XML

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="ShopArea.xslt"?>
<ShopArea>
<Connection name="Connection1">
    <Report date="25-09-2011">

        <Query id="1">
            <TABLE1>1.1</TABLE1>
            <TABLE2>1.2</TABLE2>
            <TABLE3>1.3</TABLE3>
        </Query>
        <Query id="2">
            <TABLE21>2.1</TABLE21>
            <TABLE22>2.2</TABLE22>
            <TABLE23>2.3</TABLE23>
        </Query>
    </Report>

    <Report date="26-09-2011">
        <Query id="1">
            <TABLE1>26 1.1</TABLE1>
            <TABLE2>26 1.2</TABLE2>
            <TABLE3>26 1.3</TABLE3>
        </Query>
        <Query id="2">
            <TABLE21>26 2.1</TABLE21>
            <TABLE22>26 2.2</TABLE22>
            <TABLE23>26 2.3</TABLE23>
        </Query>
    </Report>
</Connection>
</ShopArea>

List of elements including duplicates

Я ссылался Как выбрать уникальные узлы в XSLT , но яне в состоянии понять это правильно.

1 Ответ

1 голос
/ 28 сентября 2011

I.XSLT 1.0.В этом преобразовании используется простая мюнхенская группировка :

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

 <xsl:key name="kChildByName" match="Query/*"
  use="name()"/>

 <xsl:template match=
  "Query/*
       [generate-id()
       =
        generate-id(key('kChildByName', name())[1])
       ]">
     <xsl:value-of select="name()"/>
     <xsl:text>&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

При применении к предоставленному документу XML :

<ShopArea>
    <Connection name="Connection1">
        <Report date="25-09-2011">
            <Query id="1">
                <TABLE1>1.1</TABLE1>
                <TABLE2>1.2</TABLE2>
                <TABLE3>1.3</TABLE3>
            </Query>
            <Query id="2">
                <TABLE21>2.1</TABLE21>
                <TABLE22>2.2</TABLE22>
                <TABLE23>2.3</TABLE23>
            </Query>
        </Report>
        <Report date="26-09-2011">
            <Query id="1">
                <TABLE1>26 1.1</TABLE1>
                <TABLE2>26 1.2</TABLE2>
                <TABLE3>26 1.3</TABLE3>
            </Query>
            <Query id="2">
                <TABLE21>26 2.1</TABLE21>
                <TABLE22>26 2.2</TABLE22>
                <TABLE23>26 2.3</TABLE23>
            </Query>
        </Report>
    </Connection>
</ShopArea>

желаемый, правильный результат (все различные имена элементов, которые являются потомками Query), получается :

TABLE1
TABLE2
TABLE3
TABLE21
TABLE22
TABLE23

II.XSLT 2.0: это преобразование использует <xsl:for-each-group>:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*/*">
     <xsl:for-each-group select="Report/Query/*"
                         group-by="name()">
      <xsl:sequence select="current-grouping-key(), '&#xA;'"/>
     </xsl:for-each-group>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>
...