Как скопировать определенный атрибут с помощью XSLT?

Приношу извинения за основной характер этих вопросов - я новичок в XSLT (и в Stack Overflow тоже).

I необходимо преобразовать следующий XML, возвращаемый веб-службой Sharepoint:

<GetGroupCollectionFromUser xmlns=
   "http://schemas.microsoft.com/sharepoint/soap/directory/">
   <Groups>
      <Group ID="3" Name="Group1" Description="Description" OwnerID="1" 
         OwnerIsUser="False" />
      <Group ID="15" Name="Group2" Description="Description" 
         OwnerID="12" OwnerIsUser="True" />
      <Group ID="16" Name="Group3" Description="Description" 
         OwnerID="7" OwnerIsUser="False" />
   </Groups>
</GetGroupCollectionFromUser>

в этот:

<GetGroupCollectionFromUser xmlns=
   "http://schemas.microsoft.com/sharepoint/soap/directory/">
   <Groups>
      <Group Name="Group1" />
      <Group Name="Group2" />
      <Group Name="Group3" />
   </Groups>
</GetGroupCollectionFromUser>

В основном, мне нужно отбросить все атрибуты для каждого элемента группы, кроме имени. После долгих исследований и переделок, в частности отказа от объявления пространства имен из исходного XML, я придумал кое-что, что дает мне почти то, что мне нужно:

<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="/GetGroupCollectionFromUser">
    <xsl:copy>                  
        <xsl:apply-templates select="Groups" />
    </xsl:copy>
</xsl:template>

<xsl:template match="Groups">
    <xsl:copy>
        <xsl:apply-templates select="Group" />
    </xsl:copy>
</xsl:template> 

<xsl:template match="Group">
    <xsl:copy>
        <xsl:apply-templates select="@Name" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Однако, вместо атрибута Name приведенное выше дает мне значение атрибута Name, вставленного в виде текста в элемент Group, например:

<GetGroupCollectionFromUser>
    <Groups>
        <Group>Group1</Group>
        <Group>Group2</Group>
        <Group>Group3</Group>
    </Groups>
</GetGroupCollectionFromUser>

Это в конечном итоге будет использовано сторонним приложением, которое ожидает ориентированный на атрибут XML. Я уверен, что мне не хватает чего-то до неприличия очевидного, но, что бы я ни делал с этим, я не могу использовать только атрибут Name. Два вопроса:

Как изменить XSLT, чтобы он возвращал атрибут Name для каждого элемента Group вместо его значения в виде текста?

И как мне правильно обрабатывать пространство имен? Когда я включил его в XSLT и попробовал несколько методов, основанных на примерах, которые я нашел здесь и в других местах в Интернете, я ничего не получил.

Заранее благодарим за любой совет.

7
задан Deduplicator 10 February 2015 в 22:44
поделиться