2010-05-18 5 views
2

Je souhaite générer dynamiquement des attributs xmlns.Générer des xmlns dynamiques

Je veux générer ce XSL:

< commun: MainPageBase xmlns: Common = "clr-namespace: ThisPartIsDynamic; assemblage = ThisPartIsDynamic"> </commune: MainPageBase>

Comment puis-je faire cela en XSL?

Merci, Alex

Mise à jour:

Pour être plus précis, voici ce que je dois générer. Les pièces que je veux être en mesure de changer les variables sont « THISPARTISDYNAMIC »:

<Common:MainPageBase 
    xmlns:Common="clr-namespace:THISPARTISDYNAMIC;assembly=THISPARTISDYNAMIC" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:df="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit" 
    xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit" 
    xmlns:basics="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" 
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    xmlns:uc="clr-namespace:THISPARTISDYNAMIC" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480" 
    ></Common:MainPageBase> 

Toutes les idées?

+0

Bonne question (+1). Voir ma réponse pour une solution complète. :) –

Répondre

1

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 

<xsl:variable name="vDynamicPart1" select="'DynPArt1'"/> 
<xsl:variable name="vDynamicPart2" select="'DynPArt2'"/> 

<xsl:template match="/"> 

    <xsl:element name="Common:MainPageBase" 
    namespace="clr-namespace:{$vDynamicPart1};assembly={$vDynamicPart2}"/> 

</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur tout document XML (non utilisé), produit le résultat souhaité.

+0

Merci pour votre réponse mais "ThisPartIsDynamic" n'est pas dynamique .. Je voudrais faire quelque chose comme clr-namespace: ; assemblage = mais je sais que je ne peux pas faire ça ... – alexbf

+0

@alexbf: Désolé, je n'ai pas fait Je remarque que. J'ai mis à jour ma solution et cela résout votre problème. –

+0

Cela ne fonctionne pas. nous obtenons Mais ce que nous voulons est vraiment alexbf

1

Vous pouvez définir l'espace de noms d'un élément dynamique:

<param name="ns1" >http://localhost/ns1</param> 
... 
<xsl:element name="test" namespace="{$ns1}" >... </xsl:element> 

Mais qui fait un préfixe d'espace de nom ne sort pas - il change l'espace de noms par défaut sur cet élément.

Je ne pense pas qu'il existe un moyen de produire les préfixes avec un URI d'espace de noms dynamique. Quelque chose comme: <xyz:test xmlns:xyz="{$ns1}"> sorties exactement littéralement: <xyz:test xmlns:xyz="{$ns1}">

Si tel est vraiment la sortie exacte dont vous avez besoin, alors je pense que vous avez soit de modifier le sérialiseur, ou tout simplement produire la sortie avec un espace réservé URI et faire un remplacement de texte sur le texte XML de sortie.

[XSLT ne traite pas la syntaxe XML. Il traite les arbres XML. L'analyse de l'entrée et la sérialisation de la sortie sont en dehors de son domaine. ]