2016-07-27 30 views
0

Ich habe eine XML-Datei, die mehrere Elemente mit dem Namen FileName1, FileName2, FileName3 usw. enthält. Ich muss das Dokument für diese Elementnamen überprüfen und sie dann "FileName" umbenennen.Wie überprüft man, ob ein Elementname eine bestimmte Zeichenfolge in XSLT enthält, und diese Elemente dann umbenennt?

Hier ist der XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ProcessData> 
    <Transformed> 
    <ConnectionZone>Internal</ConnectionZone> 
    <Directory>/Test/Inbox</Directory> 
    <FTPProfileID>XYZ</FTPProfileID> 
    <FileName1>Test1.txt</FileName1> 
    <FileName2>Test2.txt</FileName2> 
    <MoveDirectory>/Test/MovedFiles</MoveDirectory> 
    <Operation>MV</Operation> 
    <RenameExt>.csv</RenameExt> 
    </Transformed> 
</ProcessData> 

Hier ist, was ich in der XSLT habe bisher:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <table> 
     <xsl:if test="//*[contains(name(), 'FileName']"> 
      <xsl:element name="FileName"> 
     </xsl:if>  
    </table> 
</xsl:template> 
</xsl:stylesheet> 

Nichts, was ich versuche, so weit als erfolgreich erwiesen hat. Ich kann anscheinend keine Übereinstimmungen in meiner xsl: if-Anweisung finden.

Bitte lassen Sie mich wissen, wenn Sie eine bessere Möglichkeit finden, dies zu tun! Ich muss nur das letzte Zeichen (Ziffer) jedes Elementnamens entfernen, der "FileName" enthält.

Danke!

Antwort

0

Sie benötigen nur eine Vorlage für diese Elemente schreiben mit

<xsl:template match="*[starts-with(local-name(), 'FileName')]"> 
    <FileName> 
    <xsl:apply-templates/> 
    </FileName> 
</xsl:template> 

und natürlich sind die Identitätstransformation Vorlage

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

als das wichtigste Instrument der Verarbeitung des Restes zu halten.

0

Um Martins Antwort zu erweitern, haben Sie ein klassisches Transformationsmuster, bei dem Sie alles unverändert kopieren möchten, außer ein paar Dinge, die Sie ändern möchten. Die Lösung für solche Probleme ist immer: Schreiben Sie eine Identitätsvorlagenregel, die alles entspricht und kopiert sie unverändert (Martins zweite Regel), und schreiben Sie dann bestimmte Vorlagenregeln, die den Dingen entsprechen, die Sie ändern wollen, in diesem Fall ist jedes Element dessen Name beginnt mit "Dateiname".

Standardmäßig arbeitet sich die Umwandlung einfach durch die Baum-Übereinstimmungselemente und schießt Vorlagenregeln ab. Solange jede Vorlagenregel xsl: apply-templates aufruft, um die untergeordneten Elemente des aktuellen Elements zu verarbeiten, wird jedes Element im Dokument abgeglichen und so verarbeitet, wie es in der Regel für die beste übereinstimmende Vorlage für dieses Element angegeben ist.