2008-08-26 15 views
13

Ich möchte ein XML-Dokument transformieren. Die Quelle XML sieht wie folgt aus:Dynamische Elementnamen

<svc:ElementList> 
    <svc:Element> 
     <Year>2007</Year> 
    </svc:Element> 
    <svc:Element> 
     <Year>2006</Year> 
    </svc:Element> 
    <svc:Element> 
     <Year>2005</Year> 
    </svc:Element> 
</svc:ElementList> 

ich, dass in machen wollen:

<ElementList> 
    <NewTag2007/> 
    <NewTag2006/> 
    <NewTag2005/> 
</ElementList> 

Die folgende Codezeile funktioniert nicht:

<xsl:element name="{concat('NewTag',Element/Year)}"/> 

Die Ausgabe ist eine Serie von Elementen, die wie folgt aussehen: < NewTag>. (Ohne Leerzeichen ...)

"// Element/Jahr", "./Element/Year" und "// svc: Element/Jahr" auch nicht funktionieren. Eine Schwierigkeit besteht darin, dass sich das Tag "Element" im Namensraum "svc" befindet, während sich das Tag "Year" im Standardnamespace befindet.

Wie auch immer, stehe ich vor einem Namespace-Problem oder missbrauche ich die "concat()" Funktion?

+0

Froh, dass die Lösung funktioniert. Aber generell würde ich empfehlen, während der Laufzeit KEINE Tag-Namen zu erstellen (obwohl es funktioniert!). Ich verstehe die XML-TAG-Struktur auf eine eher statische Art und Weise. Meine Lösung wäre: Nimm ein statisches XML-Tag wie mit einem solchen Attribut. Sie können weiterhin mit XSLT und XPath mit "element [year =" 2007 "] darauf zugreifen. Sie verlieren also nicht an Flexibilität, sondern gewinnen Sicherheit und Konsistenz ... Nur ein paar Worte. – Sauer

Antwort

12

Wahrscheinlich Namespace Probleme und vielleicht eine mit dem aktuellen Kontext. Für Quelle (mit zusätzlichen Namespace-Deklaration, um es wohlgeformtes XML)

<svc:ElementList xmlns:svc="svc"> 
    <svc:Element> 
    <Year>2007</Year> 
    </svc:Element> 
    <svc:Element> 
    <Year>2006</Year> 
    </svc:Element> 
    <svc:Element> 
    <Year>2005</Year> 
    </svc:Element> 
</svc:ElementList> 

das Stylesheet

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:svc="svc" 
       version="1.0"> 
    <xsl:template match="svc:ElementList"> 
    <xsl:element name="{local-name()}"> 
     <xsl:for-each select="svc:Element"> 
     <xsl:element name="{concat('NewTag', Year)}"/> 
     </xsl:for-each> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

geben Ihnen die Ausgabe, die Sie benötigen. Beachten Sie, dass svc:Element mit dem Präfix Namespace ausgewählt werden muss und dass der Kontext beim Generieren der neuen Tags svc:Element ist, nicht svc:ElementList.

+0

FYI, wenn Sie in concat auf Parameter verweisen müssen, benutze '{concat {'a', $ myParam, 'c')}' – raffian

Verwandte Themen