2017-02-28 4 views
0

Ich habe einen Anwendungsfall, der in keiner der anderen Duplikat-und-ändern-Antwort fällt.XSLT: Kopieren und ändern

Ich habe das folgende XML-Fragment:

<Elements> 
    <Irrelevant/> 
    <Item> 
     <Misc. subelements> 
     <Name>A</Name> 
     <Misc. subelements> 
    </Item> 
    <Irrelevant/> 
    <Item> 
     <Misc. subelements> 
     <Name>B</Name> 
     <Misc. subelements> 
    </Item> 
</Elements> 

und müssen sie in das folgende Fragment zu transformieren (das Suffix „_x“ wird über einen Template-Parameter injiziert, die in übergeben wird, aber die Antwort kann es nur angenommen werden, immer „_x“) sein:

<Elements> 
    <Irrelevant/> 
    <Item> 
     <Misc. subelements (copied as-is)> 
     <Name>A</Name> 
     <Misc. subelements (copied as-is)> 
    </Item> 
    <Item> 
     <Misc. subelements (copied as-is)> 
     <Name>A_x</Name> 
     <Misc. subelements (copied as-is)> 
    </Item> 
    <Irrelevant/> 
    <Item> 
     <Misc. subelements (copied as-is)> 
     <Name>B</Name> 
     <Misc. subelements (copied as-is)> 
    </Item> 
    <Item> 
     <Misc. subelements (copied as-is)> 
     <Name>B_x</Name> 
     <Misc. subelements (copied as-is)> 
    </Item> 
</Elements> 

dh jedes Item kopiert einmal in seiner ursprünglichen Form und einmal in seiner modifizierten Form. Ich habe kein Problem, nur das Originalformular oder nur das modifizierte Formular zu kopieren, aber es ist eine Herausforderung, zu unterscheiden, ob der aktuelle Kontext als Original oder Modifiziert kopiert werden soll.

+1

Können Sie uns einen XSLT-Versuch zeigen, den Sie haben? Doing ' _ x' klingt einfach. Oder verwenden Sie einen Modus, um die Änderung zu bearbeiten. –

+0

Ich habe vergessen zu erwähnen, dass Item viele andere Elemente zusätzlich zu Name enthält, die ich unverändert kopieren möchte (unmodifiziert und ohne explizite Übereinstimmung). Ich habe das Beispiel aktualisiert und werde versuchen, meine XSLT einzubinden. – pmf

Antwort

1

Beginnen Sie mit der Identitätstransformation Vorlage

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

dann eine Vorlage für Item Elemente

<xsl:template match="Item"> 
    <xsl:copy-of select="."/> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select="node()" mode="change"/> 
    </xsl:copy> 
</xsl:template> 

fügen Sie dann eine Vorlage für Name Elemente im Modus mit einem change

<xsl:template match="Name" mode="change"> 
    <xsl:copy> 
    <xsl:value-of select="concat(., $suffix)"/> 
    </xsl:copy> 
</xsl:template> 

schreiben globaler Parameter <xsl:param name="suffix" select="'_x'"/>.

+0

Ich habe versucht, die Modusmechanik mit einem zusätzlichen Parameter zu emulieren, der dynamisch ausgewertet wurde, weil ich nicht wusste, dass so etwas wie "Modus" existiert. Vielen Dank! – pmf