Renommer les nœuds avec XSLT

Je suis en train d'essayer quelque chose de très simple, mais pour quelque raison il ne fonctionne pas. En gros, j'ai besoin de renommer certains nœuds d'un document XML. Ainsi, j'ai créé un fichier XSLT pour faire la transformation.

Voici un exemple de XML:

EDIT: adresses et Adresses des éléments se produire à plusieurs niveaux. C'est ce qui m'a amené à avoir à essayer et d'appliquer une transformation XSLT. Visual Studio dataset typé fonctionnalité, ce qui crée typés de fichiers XSD ne vous permet pas d'avoir les références imbriquées à la même table. Ainsi, les Entreprises/les Entreprises/les Adresses et les Entreprises/Entreprise/Contact/Adresses des causes de la Charge() à l'échec. C'est un problème connu, et tout ce qu'ils vous disent quelque chose comme "vous N'avez pas de table imbriquée références...modifier votre XSD cesser d'avoir qu'." Malheureusement, cela signifie que nous devons utiliser XSLT pour faire le XML se conformer à la "piraté" XSD, étant donné que les fichiers provenant d'un fournisseur tiers.

Donc, nous sommes très proches avec l'aide rendue ici. Le dernier couple de choses sont présentes:

1.) Comment puis-je utiliser l'espace de noms de référence dans le match de l'attribut xsl:template, afin de préciser que je veux renommer les Entreprises/les Entreprises/les Adresses de BusinessAddresses, mais renommer les Entreprises/Entreprise/Contacts/Contacts/Adresses à ContactAddresses?

2.) Comment puis-je arrêter le XSLT à partir de l'encombrer chaque nouvel élément explicite de l'espace de noms des références? Il est à l'origine de l'extrême dilatation dans la sortie.

J'ai créé un espace de noms appelé "acier", et était d'avoir un bon succès avec:

<xsl:template match="steel:Addresses>
  <xsl:element name="BusinessAddresses>
</xsl:template>

Le problème évident est qu'ici il renomme TOUS des Adresses éléments de BusinessAddresses, même si je veux que certains d'entre eux nommé ContactAddresses, et ainsi de suite. L'inutile plus explicite de l'espace de noms de références à l'ensemble de la renommée des nœuds est également inquiétante.

J'ai essayé ce genre de chose, mais dès que j'ajoute des barres obliques pour le match de l'attribut, c'est une erreur de syntaxe dans le XSLT, comme suit:

<xsl:template match="steel:/Businesses/Business/Addresses">

Je me sens très proche, mais besoin de quelques conseils sur la façon de mélanger à la fois l'espace de noms de l'utilisation et de la manière d'utiliser les barres obliques pour sélectionner TOUT nœuds en vertu des chemins spécifiques.

<?xml version="1.0"?>
<Businesses>
  <Business>
    <BusinessName>Steel Stretching</BusinessName>
    <Addresses>
      <Address>
        <City>Pittsburgh</City>
      </Address>
      <Address>
        <City>Philadelphia</City>
      </Address>
    </Addresses>
    <Contacts>
      <Contact>
        <FirstName>Paul</FirstName>
        <LastName>Jones</LastName>
        <Addresses>
          <Address>
            <City>Pittsburgh</City>
          </Address>
        </Addresses>
      </Contact>
    </Contacts>
  </Business>
  <Business>
    <BusinessName>Iron Works</BusinessName>
    <Addresses>
      <Address>
        <City>Harrisburg</City>
      </Address>
      <Address>
        <City>Lancaster</City>
      </Address>
    </Addresses>
  </Business>
</Businesses>

J'ai besoin de renommer les Adresses de BusinessAddresses, et j'ai besoin de renommer Adresse à BusinessAddress, pour chaque instance d'Adresses et l'Adresse directement dans une Entreprise nœud. J'ai aussi besoin de renommer les Adresses de ContactAddresses, et j'ai besoin de renommer Adresse à ContactAddress, pour chaque instance d'adresses et Adresses directement sous un Nœud de Contact.

J'ai essayé plusieurs solutions, mais aucune ne semble fonctionner. Tous finissent par produire les mêmes XML du fichier d'origine.

Voici un exemple de ce que j'ai essayé:

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

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

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

Ce qui a été essayé dans au moins 6 saveurs différentes, complète avec des pas à pas dans le debugger XSLT dans VB.Net. Il n'est jamais exécuté le template match pour les Adresses.

Pourquoi?

  • J'ai donné une réponse ci-dessous, mais je ne suis pas sûr que ça aide. Se pourrait-il que le XML en cours de traitement a des fautes de frappe dans les noms de balise? Je ne suis pas sûr de ce que d'autre à dire - est-il plus en détails qui peuvent être fournis?
  • Merci pour la réponse. Je vais ajouter plus ce soir.
  • Comment à propos de problèmes d'espace de noms? Peut-être que vous avez déclaré un espace de noms par défaut dans le document XML d'entrée, mais pas déclarée avec le préfixe requis dans le XSLT?