2016-09-02 3 views
0

Ich möchte ändern Atrribute Wert und ersetzen Sie eine Teilzeichenfolge des Elements mit XSL.XSL: Wie ersetzen Zeichenfolge und ändern Attributwert

XML

<...> 
    <communication type="telephone">123 456 789 </communication> 
    <communication type="telephone">789 (EXT)</communication> 
    <communication type="telephone">123 456 789 </communication> 
</...> 

sollte

<...> 
    <communication type="telephone">123 456 789 </communication> 
    <communication type="ext">789</communication> 
    <communication type="telephone">123 456 789 </communication> 
</...> 

XSL (2,0)

<xsl:template match="communication[@type='telephone'][contains(text(),'(EXT)')]"> 
<xsl:copy> 
    <xsl:value-of select="replace(., '(EXT)', '')"/> 
    <xsl:attribute name="extension">true</xsl:attribute> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:copy> 

Saxxon heißt „ein Attributknoten kann nicht creat sein ed nach einem Kind des enthaltenden Elements "

Ich habe nicht erreicht, den Wert des Attributtyps zu ändern, also habe ich ein neues Attribut erstellt. Aber selbst mit dieser Problemumgehung habe ich keine Idee, wie beide Anforderungen (Attribut hinzufügen UND Teilstring entfernen) funktionieren.

Jede Idee, die dies löst, wird sehr geschätzt!

+0

Ihr Titel sagt „* Änderung Attributwert *“ und die Ausgabe zeigt, dass Sie den Wert des 'Baumuster zur ändern möchten Attribut von "Telefon" zu "ext". Aber Ihr Code fügt ein neues 'extension' Attribut hinzu. Welches ist richtig? –

+0

Entschuldigung dafür. Ich wollte ein weiteres Attribut "Erweiterung" mit demselben Wert hinzufügen. – user1491184

Antwort

0

Ich glaube, Sie

<xsl:template match="communication[@type = 'telephone' and contains(., '(EXT)')]"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:attribute name="extension">true</xsl:attribute> 
    <xsl:value-of select="replace(., '(EXT)', '')"/> 
    </xsl:copy> 
</xsl:template> 
1

Dieser Teil soll:

<xsl:value-of select="replace(., '(EXT)', '')"/> 

erzeugt einen Textknoten, die ein Kind von communication ist. Sobald Sie das getan haben, können Sie keine Attribute mehr von communication erstellen. Sie haben zwei Anweisungen, die versuchen, das zu tun:

<xsl:attribute name="extension">true</xsl:attribute> 

und:

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

(der @*) Teil.

Die xsl:attribute Anweisung muss zuerst kommen - und Sie wollen wirklich nicht die xsl:apply-templates Anweisung hier verwenden, da Sie bereits alle Inhalte selbst erstellt haben. Bitte beachten Sie, dass Ihre replace() die Klammern nicht ersetzt

Natürlich könnte man es viel einfacher machen, indem nur tun:

<xsl:template match="communication[@type='telephone'][contains(text(),'(EXT)')]"> 
    <communication extension="true"> 
     <xsl:value-of select="replace(., '\(EXT\)', '')"/> 
    </communication> 
</xsl:template>