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?
Vous devez vous connecter pour publier un commentaire.
Pourquoi une transformation XSLT échec?
D'une transformation XSLT va échouer parce que des choses évidentes comme des fautes de frappe. Cependant, la situation la plus probable se rapporte à l'utilisation de l'espace de noms. Si vous avez déclaré un espace de noms par défaut pour votre XML, mais ne comprennent pas que, dans votre XSLT XSLT ne pas correspondre à la modèles que vous pourriez vous attendre.
L'exemple suivant ajoute le
xmlns:business
attribut qui déclare que les objets qualifiés par labusiness
préfixe appartiennent à l'espace de nomsmynamespace.uri
. J'ai ensuite utilisé ce préfixe pour qualifier l'Adresse et les Adresses modèle de matchs. Bien sûr, vous aurez besoin de modifier l'URI d'espace de noms à tout ce qui correspond à l'espace de noms par défaut de votre fichier XML.Comment voulez-vous correspondre à des modèles fondés sur l'élément de l'emplacement ainsi que le nom?
Il y a plusieurs façons de parvenir à cette dernière partie de votre problème, BusinessAddress ou ContactAddress, mais le plus simple est de modifier le modèle
match
attributs à considérer les nœuds parents. Si vous pensez que lematch
attribut comme un chemin d'accès dans le XML pour un nœud, cette option devient plus clair (le contenu des modèles de laisser sortir pour des raisons de concision):D'autres méthodes existent pour la réalisation de cette si la
match
reste basée sur le nom de l'élément, mais ils sont plus difficiles à mettre en œuvre, suivre et maintenir car ils impliquent l'utilisation de la réserve de vérifications sur le nœud parent de la hiérarchie de l'élément en cours de traitement, le tout dans le modèle.Peut-être de ce que, si les données vous montrer, c'est vraiment comme ce que vous avez eu à travailler avec