2017-08-30 3 views
0

Ich muss alle meine Attribute in der XML in Elemente mit einigen Bedingungen konvertieren. Sagen Sie zum Beispiel, dass einigen Attributen der "Wert" vorangestellt werden sollte. Ich bin soweit gekommen. Dazu muss ich auch meinen Namensraum ändern. Das konnte ich nicht erreichen.Wie ändert man den Namespace in xml mit xslt

XML

<Template xmlns="styling/1.0.0" Name="TemplateFromDictionary"> 

    <Style Name="Default"> 
    <Fill Color=""/> 
    <Stroke Color="0000FF" LineStyle="Single" Width="1"/> 
    <Symbol Color="FFFFFF" Name="default.png" ScaleX="100" ScaleY="100" ScaleMode="Drawing"/> 
    </Style> 

    <Style Name="Parcel"> 
    <Fill Color="48F5F5F5"/> 
    <Stroke Color="C0C0C0" LineStyle="Single" Width="1"/> 
    <Symbol Color="FFFFFF" Name="default.png" ScaleX="100" ScaleY="100" ScaleMode="Drawing"/> 
    </Style> 

</Template> 

XSLT

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       exclude-result-prefixes="msxsl" 
       xmlns:s="styling/1.0.0" 
       xmlns="styling/1.0.0"> 

    <xsl:output method="xml" indent="yes"/> 

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

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

    <xsl:template match="@*"> 
    <xsl:variable name="name"> 
     <xsl:apply-templates select="." mode="name"/> 
    </xsl:variable> 
    <xsl:element name="{$name}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@Color|@Width|@ScaleX|@ScaleY|@LeftIndent|@RightIndent|@FirstLineIndent|@SpaceBefore|@SpaceAfter|@Size" mode="name"> 
    <xsl:value-of select="concat(name(), 'Value')"/> 
    </xsl:template> 

    <xsl:template match="@*" mode="name"> 
    <xsl:value-of select="name()"/> 
    </xsl:template> 

</xsl:stylesheet> 

OUTPUT

<?xml version="1.0" encoding="utf-8"?> 
<Template Name="TemplateFromDictionary" xmlns="styling/1.0.0"> 

    <Style Name="Default"> 
    <Fill> 
     <ColorValue></ColorValue> 
    </Fill> 
    <Stroke> 
     <ColorValue>0000FF</ColorValue> 
     <LineStyle>Single</LineStyle> 
     <WidthValue>1</WidthValue> 
    </Stroke> 
    <Symbol> 
     <ColorValue>FFFFFF</ColorValue> 
     <Name>default.png</Name> 
     <ScaleXValue>100</ScaleXValue> 
     <ScaleYValue>100</ScaleYValue> 
     <ScaleMode>Drawing</ScaleMode> 
    </Symbol> 
    </Style> 

    <Style Name="Parcel"> 
    <Fill> 
     <ColorValue>48F5F5F5</ColorValue> 
    </Fill> 
    <Stroke> 
     <ColorValue>C0C0C0</ColorValue> 
     <LineStyle>Single</LineStyle> 
     <WidthValue>1</WidthValue> 
    </Stroke> 
    <Symbol> 
     <ColorValue>FFFFFF</ColorValue> 
     <Name>default.png</Name> 
     <ScaleXValue>100</ScaleXValue> 
     <ScaleYValue>100</ScaleYValue> 
     <ScaleMode>Drawing</ScaleMode> 
    </Symbol> 
    </Style> 

</Template> 

In Ausgang statt dessen

<Template Name="TemplateFromDictionary" xmlns="styling/1.0.0"> 

Ich brauche diese

<Template Name="TemplateFromDictionary" xmlns="styling/2.0.0"> 

Ich habe versucht, durch den Namespace in Xslt zu xmlns="styling/2.0.0" Ändern Dies ist aber die Ergebnisse wie

<Fill><ColorValue xmlns="styling/2.0.0"></ColorValue></Fill>

Der Namespace gibt in alle Elemente eingebettet ist und das Vorlagenelement sieht gleich aus

<Template Name="TemplateFromDictionary" xmlns="styling/1.0.0">

Ich brauche die Ausgabe genau wie die oben erwähnte Ausgabe nur der Namespace in Template-Element muss geändert werden.

Ich verwandle dies mit C#.

Bitte helfen Sie mir dabei.

Antwort

1

Ändern der Namensraum von alle Elemente können Sie sie mit xsl:element mit einem namespace Attribut rekonstruieren. So ist der folgende Code ändert zwei Vorlagen und fügt eine allgemeine "use-new-Namensraum" Vorlage:

<!-- use-new-namespace template for all s:* elements --> 
<xsl:template match="s:*"> 
    <xsl:element name="{local-name()}" namespace="styling/2.0.0"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

<!-- modified templates for new namespace --> 
<xsl:template match="s:Style|s:Template"> 
    <xsl:element name="{local-name()}" namespace="styling/2.0.0"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates select="node()"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:variable name="name"> 
     <xsl:apply-templates select="." mode="name"/> 
    </xsl:variable> 
    <xsl:element name="{$name}" namespace="styling/2.0.0"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

So ist die ganze XSLT-Datei ist:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       exclude-result-prefixes="msxsl" 
       xmlns:s="styling/1.0.0" 
       xmlns:t="styling/2.0.0"> 

    <xsl:output method="xml" indent="yes"/> 

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

    <!-- use-new-namespace template for s:* elements --> 
    <xsl:template match="s:*"> 
    <xsl:element name="{local-name()}" namespace="styling/2.0.0"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

    <!-- modified templates for new namespace --> 
    <xsl:template match="s:Style|s:Template"> 
    <xsl:element name="{local-name()}" namespace="styling/2.0.0"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates select="node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:variable name="name"> 
     <xsl:apply-templates select="." mode="name"/> 
    </xsl:variable> 
    <xsl:element name="{$name}" namespace="styling/2.0.0"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@Color|@Width|@ScaleX|@ScaleY|@LeftIndent|@RightIndent|@FirstLineIndent|@SpaceBefore|@SpaceAfter|@Size" mode="name"> 
    <xsl:value-of select="concat(name(), 'Value')"/> 
    </xsl:template> 

    <xsl:template match="@*" mode="name"> 
    <xsl:value-of select="name()"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Es tut mir so leid, ich konnte es nicht verstehen. Könnten Sie bitte etwas näher ausführen? – shanmugharaj

+0

Kurz gesagt, fügen Sie die erste Vorlage oben hinzu und ändern Sie die anderen beiden in Ihrem XSLT. Dann erhält jedes Element den neuen Namensraum. – zx485

+0

Ich habe jetzt ein weiteres Problem in diesem. Dies ist eine neue Verbesserung, die ich tun muss. Tatsächlich muss beim Schreiben der Ausgabe für Symbole ' default.png' dem Namenattribut das Präfix C: \ oder C: \ dwg \ vorangestellt werden, basierend auf dem Inhalt des Namensattributs 'png' oder 'dwg'. Ich habe versucht, die Bedingung hier in diesem '' zu setzen. Aber das funktionierte nicht. Könnten Sie mir bitte dabei helfen? – shanmugharaj

0

Eine Möglichkeit, Ihr Ziel zu erreichen, besteht darin, das Template-Element mit dem neuen Namespace neu zu schreiben. Zum Beispiel: Fügen Sie die folgende Vorlage zu Ihrem Xslt:

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

<xsl:template match="s:Template" xmlns:ns2="styling/2.0.0"> 
    <ns2:Template> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates select="node()"/> 
    </ns2:Template> 
</xsl:template> 

und entfernen Sie die alten s: Style | s: Template passende Vorlage

mehr klar zu sein:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       exclude-result-prefixes="msxsl" 
       xmlns:s="styling/1.0.0" 
       xmlns="styling/1.0.0"> 

    <xsl:output method="xml" indent="yes"/> 

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

<xsl:template match="s:Template" xmlns:ns2="styling/2.0.0"> 
    <ns2:Template> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates select="node()"/> 
    </ns2:Template> 
</xsl:template> 

    <xsl:template match="@*"> 
    <xsl:variable name="name"> 
     <xsl:apply-templates select="." mode="name"/> 
    </xsl:variable> 
    <xsl:element name="{$name}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@Color|@Width|@ScaleX|@ScaleY|@LeftIndent|@RightIndent|@FirstLineIndent|@SpaceBefore|@SpaceAfter|@Size" mode="name"> 
    <xsl:value-of select="concat(name(), 'Value')"/> 
    </xsl:template> 

    <xsl:template match="@*" mode="name"> 
    <xsl:value-of select="name()"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Haben Sie OP nicht denken könnte Soll der neue Namespace auf _alle_ Elemente angewendet werden und der alte Namespace im Wesentlichen verworfen werden? – kumesana