Changement de noms de fichier XML XSL Traduction
J'ai donc un fichier d'entrée qui utilise mon entreprise d'espace de noms dans l'espace de noms par défaut (xmlns="companyURL"
) mais je veux que mon fichier de sortie à utiliser autre chose que l'espace de noms par défaut (xmlns:cmp="companyURL"
). Donc je construire mon fichier à l'aide de la cmp
espace de noms, mais je veux copier certains éléments intérieurs:
<xsl:element name="cmp:container">
<xsl:for-each select="foo">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:element>
Malheureusement, ce n'est de définir l'espace de noms par défaut pour chacun de ces éléments internes, rendant le fichier incroyablement détaillé et le laid. Exemple simplifié:
Source:
<foo xmlns="companyURL">
<num1>asdf</num1>
<num2>ghjkl</num2>
</foo>
Se transforme en:
<cmp:container xmlns:cmp="companyURL">
<num1 xmlns="companyURL">asdf</num1>
<num2 xmlns="companyURL">ghjkl</num2>
</cmp:container>
Bien sûr, companyURL
est gros et long et moche, et c'est la même dans les deux endroits, donc je préfère le résultat ci-dessus pour juste être la suivante:
<cmp:container xmlns:cmp="companyURL">
<cmp:num1>asdf</cmp:num1>
<cmp:num2>ghjkl</cmp:num2>
</cmp:container>
Est-il un moyen facile de faire cela, ou dois-je tout convertir en vertu de la cmp
espace de noms à l'espace de noms par défaut? Je préfère utiliser explicitement l'espace de noms de nommage si possible, il aide à comprendre le XSLT dans mon expérience.
"voulez mon fichier de sortie à utiliser autre chose que l'espace de noms par défaut" >> suivant votre exemple, en changeant le préfixe (ou de défaut à un préfixe) ne signifie pas l'évolution de l'espace de noms. Les éléments, à partir d'un XML+NS point de vue, restera égale (localname + espace de noms n'est pas modifiée), même si le préfixe est différent.
Je faisais allusion à la visible identificateur devant le nom de la balise.
OriginalL'auteur adam_0 | 2010-08-12
Vous devez vous connecter pour publier un commentaire.
Cette transformation:
lorsqu'elle est effectuée sur le document XML fourni par le:
produit le voulait, résultat correct:
<xsl:copy-of select="@*"/>
dans votre XSLT?Cette copie tous les attributs de l'élément. Dans votre exemple concret, il n'y a pas d'attributs, mais si nous voulons utiliser ce code comme un général convertisseur, il doit être capable de convertir correctement tous les documents, y compris dans laquelle il y a des éléments avec des attributs.
Si vous êtes sûr à 100% que vous pouvez le supprimer, mais en laissant, il ne fait pas de mal n'importe quoi -- tout simplement pas les attributs seront copiés. Il est toujours mieux d'avoir plus de code générique. Imaginez que demain il y a un changement dans le schéma et il y aurait des attributs. Ensuite, vous devez ajouter la copie d'attributs. Dans le cas où vous avez utilisé le plus générique de code à partir du début, ce changement de schéma ne vous touchera pas.
Un suivi j'ai juste pensé: pourrais-je faire ce travail pour n'importe quel préfixe d'espace de noms par la modification de la top modèle de la ligne de
<xsl:element name="cmp:{name()}" namespace="CompanyURL">
à<xsl:element name="cmp:{local-name()}" namespace="CompanyURL">
(dans les faits, coupez les préfixe d'espace de noms et le mettre sur mon propre)?Oui, c'est la façon de le faire-préfixe de renommage.
OriginalL'auteur Dimitre Novatchev