Извлеките подмножество XML-файла с помощью XSL

У меня есть этот XML-файл:

<Response>
    <errorCode>error Code</errorCode>
    <errorMessage>msg</errorMessage>
    <ResponseParameters>
        <className>
            <attribute1>a</attribute1>
            <attribute2>b</attribute2>
        </className>
    </ResponseParameters>
</Response>

И я хочу, чтобы результат был:

<className>
    <attribute1>a</attribute1>
    <attribute2>b</attribute2>
</className>

Мой текущий файл XSL также включает тег ResponseParameters, который мне не нужен.

РЕДАКТИРОВАТЬ: обратите внимание, что имя класса узла является динамическим. Я не знаю, как это будет называться во время выполнения.

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output indent="yes" />

    <xsl:template match="/">
        <xsl:copy-of select="//ResponseParameters">
        </xsl:copy-of>
    </xsl:template>
</xsl:stylesheet>

Ответов (3)

Решение

Использование :

<xsl:copy-of select="/Response/ResponseParameters/node()"/>

"//"Аббревиатура очень дорого (вызывает полный XML - документ для сканирования), и его следует избегать .

Один из способов - передать параметр, содержащий имя узла, в XSLT и использовать параметр, переданный с функцией name (), чтобы соответствовать динамическому узлу.

Редактировать:

Но в этом простом случае любой из других ответов, предлагающих ResponseParameters // * или ResponseParameters / *, является гораздо более простым решением.

<xsl:copy-of select="Response/ResponseParameters//*"/>