2012-04-12 8 views
3

Ich habe eine Quelle xml wie folgt vor:Wie Namespacepräfix in Element ersetzen und Attribute mit Xslt

<SampleRequest xmlns="http://sample.com/s" 
     xmlns:s1="http://sample.com/s1" 
     xmlns:s2="http://sample.com/s2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://sample.com/s schema.xsd"> 
<data> 
<s1:customer s1:firstName="Jim" s1:lastName="Ellison"/> 
<s2:address> 
    123 test street 
</s2:address> 
</data> 
</SampleRequest> 

Ich brauche es zu transformieren, um die folgenden

<SampleRequest xmlns="http://sample.com/t" 
     xmlns:t1="http://sample.com/t1" 
     xmlns:t2="http://sample.com/t2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://sample.com/t targetSchema.xsd"> 
<data> 
<t1:customer t1:firstName="Jim" t1:lastName="Ellison"/> 
<t2:address> 
    123 test street 
</t2:address> 
</data> 
</SampleRequest> 

beiden xmls identisch Schema hat aber anderer Namespace.

Ich habe versucht folgende Xslt folgende

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns="http://sample.com/s" 
      xmlns:s1="http://sample.com/s1" 
      xmlns:s2="http://sample.com/s2" 
      xmlns:t1="http://sample.com/t1" 
      xmlns:t2="http://sample.com/t2" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="s1 s2"> 
<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="/"> 
    <SampleRequest xmlns="http://sample.com/t" 
     xmlns:t1="http://sample.com/t1" 
     xmlns:t2="http://sample.com/t2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance"> 
      http://sample.com/t targetSchema.xsd 
     </xsl:attribute> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </SampleRequest> 
</xsl:template> 
<xsl:template match="s1:*"> 
    <xsl:element name="t1:{local-name()}" namespace="http://sample.com/t1">  
     <xsl:apply-templates select="* | node()"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="s2:*"> 
    <xsl:element name="t2:{local-name()}" namespace="http://sample.com/t2"> 
     <xsl:apply-templates select="* | node()"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

Und ich bin immer Ergebnis

<?xml version="1.0" encoding="UTF-8"?><SampleRequest xmlns="http://sample.com/t" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t2="http://sample.com/t2" xmlns:t1="http://sample.com/t1" xsi:schemaLocation=" http://sample.com/t targetSchema.xsd"> 
<t1:customer/> 
<t2:address> 
    123 test street 
</t2:address> 
</SampleRequest> 

zu bedienen Es scheint alle Attribute fehlen. Ich bin sehr neu in XSLT, jedes Bit Hilfe geschätzt

Antwort

7

Es gibt zwei Probleme in Ihrem XSLT. Erstens, wenn Sie die Elemente s1 und s2 zuordnen, versuchen Sie später nicht, Vorlagen auf Attribute anzuwenden. Sie müssen diese Anweisung

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

Mit dieser Aussage Zweitens

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

ersetzen, Sie keine Vorlagen haben solche Attribute übereinstimmen. Sie müssen eine Vorlage wie folgt:

<xsl:template match="@s1:*"> 
    <xsl:attribute name="t1:{local-name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
</xsl:template> 

Versuchen Sie, diese XSLT

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://sample.com/s" 
    xmlns:s1="http://sample.com/s1" 
    xmlns:s2="http://sample.com/s2" 
    xmlns:t1="http://sample.com/t1" 
    xmlns:t2="http://sample.com/t2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="s1 s2"> 

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <SampleRequest 
     xmlns="http://sample.com/t" 
     xmlns:t1="http://sample.com/t1" 
     xmlns:t2="http://sample.com/t2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <xsl:attribute name="xsi:schemaLocation">http://sample.com/t targetSchema.xsd</xsl:attribute> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
     </SampleRequest> 
    </xsl:template> 

    <xsl:template match="s1:*"> 
     <xsl:element name="t1:{local-name()}"> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="@s1:*"> 
     <xsl:attribute name="t1:{local-name()}"> 
     <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="s2:*"> 
     <xsl:element name="t2:{local-name()}"> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="@s2:*"> 
     <xsl:attribute name="t2:{local-name()}"> 
     <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

Bei Ihrer Probe XML angewendet, ist die folgende Ausgabe:

<SampleRequest 
    xsi:schemaLocation="http://sample.com/t targetSchema.xsd" 
    xmlns:t1="http://sample.com/t1" 
    xmlns:t2="http://sample.com/t2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://sample.com/t"> 
    <t1:customer t1:firstName="Jim" t1:lastName="Ellison"/> 
    <t2:address> 123 test street </t2:address> 
</SampleRequest> 
Verwandte Themen