2017-12-18 3 views
1

ich eine einfache XSLT auf verschiedene Fragen rund um Stackoverflow XML-Attributwert basierend erstellt haben auf ändern:Ändern Wert von XML-Attribut entfernt andere Attribute

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes" /> 
<xsl:strip-space elements="*" /> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="@Name[.='Source']"> 
    <xsl:attribute name="Id">MROClass</xsl:attribute> 
</xsl:template> 

ich es auf die folgende XML anwenden:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="TARGETDIR"> 
      <Directory Id="dirD33FABDFBCD72FAC87416BC87B4323D1" Name="Source" /> 
     </DirectoryRef> 
    </Fragment> 
</Wix> 

Das Problem ist das ID-Attribut geändert wird, aber das Attribut Name wird entfernt. Wie ändere ich einzelne Attribute, ohne andere zu entfernen? Ich habe versucht, kopieren und andere Methoden, aber die Ergebnisse sind immer die gleichen.

Beispielausgabe:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="TARGETDIR"> 
      <Directory Id="MROClass" /> 
     </DirectoryRef> 
    </Fragment> 
</Wix> 

Antwort

1

Das Name Attribut entfernt wird, weil das ist, was Sie entsprechen.

Wenn Sie das Id Attribut aktualisieren möchten, aber auf dem Name Attribut basiert, versuchen zu ändern:

match="@Name[.='Source']" 

zu:

match="*[@Name='Source']/@Id" 
1

Kopieren Sie einfach über den ursprünglichen Wert im aktuellen Kontext von abgestimmt Vorlage, indem Sie Folgendes hinzufügen. Jetzt schreiben Sie das Name Attribut vollständig mit nur einem neuen Id Attribut um.

<xsl:copy-of select="."/> 

Fuller Version:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="@Name[.='Source']"> 
    <xsl:attribute name="Id">MROClass</xsl:attribute> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 
Verwandte Themen