current-group() за исключением одного элемента в xslt

Ниже приведен мой ввод xml. Я пытаюсь сгруппировать с помощью функции current-group(), но это не соответствует моему требованию, ниже я предоставил подробности.

        <UsrTimeCardEntry>
            <Code>1<Code>
            <Name>TC1</Name>
            <Person>
                <Code>074</Code>
            </Person>
        </UsrTimeCardEntry>
        <UsrTimeCardEntry>
            <Code>2<Code>
            <Name>TC2</Name>
            <Person>
                <Code>074</Code>
            </Person>
        </UsrTimeCardEntry>

Я хочу сгруппировать его по Человеку/Коду, чтобы он выглядел так

   <Person Code="074">
       <UsrTimeCardEntry>
              <Code>1</Code>
              <Name>TC1</Name>
       </UsrTimeCardEntry>
       <UsrTimeCardEntry>
              <Code>2</Code>
              <Name>TC2</Name>
       </UsrTimeCardEntry>
</Person>

Для чего я использую приведенный ниже xslt, но он снова копирует человека, которого я не хочу, чего мне здесь не хватает, я пытался использовать current-group(), кроме и не[child::Person] но это тоже не сработало.

<xsl:template match="businessobjects">
    <xsl:for-each-group select="UsrTimeCardEntry" group-by="Person/Code">
        <Person Code="{current-grouping-key()}">
            <xsl:copy-of select="current-group()"></xsl:copy-of>
        </Person>
    </xsl:for-each-group>
</xsl:template>

person SSN    schedule 13.11.2017    source источник


Ответы (1)


Вместо использования xsl:copy-of здесь используйте xsl:apply-templates, затем вы можете добавить шаблон для игнорирования узла Person

<xsl:template match="Person" />

Это предполагает, что вы также используете шаблон идентификации для обычного копирования всех других узлов.

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

Попробуйте этот XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:strip-space elements="*" />

    <xsl:template match="businessobjects">
        <xsl:for-each-group select="UsrTimeCardEntry" group-by="Person/Code">
            <Person Code="{current-grouping-key()}">
                <xsl:apply-templates select="current-group()" />
            </Person>
        </xsl:for-each-group>
    </xsl:template>

    <xsl:template match="Person" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
person Tim C    schedule 13.11.2017