Subject: Re: [xsl] Transform help From: "Terry Badger terry_badger@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Tue, 27 Jun 2017 18:25:29 -0000 |
This should do it. You need the 2 copyall templates from Ken Holman then your template that does special processing of the parent of the elements you want to change their order within the parent. I was a bit lazy and added this to the root of the style sheet xpath-default-namespace="http://schemas.microsoft.com/wix/2006/wi" <?xml version="1.0"?> <xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="2.0"xpath-default-namespace="http://schemas.microsoft.com/wix/2006/wi"> <xsl:outputencoding="utf-8"indent="yes"/> <xsl:strip-spaceelements="*"/> <!-- ==========================================================================--> <!-- start at root and output a result document to make it easier to see --> <xsl:templatematch="/"> <xsl:variablename="file-name"select="subsequence(reverse(tokenize(document-uri(.), '/')), 1, 1)"/> <xsl:result-documenthref="{concat('../out/' , $file-name)}"> <xsl:apply-templates/> </xsl:result-document> </xsl:template> <!-- ==========================================================================--> <!--use the following to copy all of the content of a node--> <xsl:templatename="copy-content"> <xsl:apply-templatesselect="@* | processing-instruction() | comment() | * | text() | root"/> </xsl:template> <!-- ==========================================================================--> <!--default behaviours for all nodes--> <xsl:templatematch="processing-instruction() | comment() | * | @* | text()"> <xsl:copy> <xsl:call-templatename="copy-content"/> </xsl:copy> </xsl:template> <!-- ==========================================================================--> <!-- pick the parent element where we want to change the order of the children--> <xsl:templatematch="DirectoryRef"> <xsl:copy> <xsl:copy-ofselect="@*"/> <xsl:apply-templatesselect="Component[contains(File/@Source, 'Foo')]"/> <xsl:apply-templatesselect="Component[not(contains(File/@Source, 'Foo'))]"/> </xsl:copy> </xsl:template> </xsl:stylesheet> Terry On Tuesday, June 27, 2017 12:52 PM, "Joseph L. Casale jcasale@xxxxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: I have an XML file with the following format: <?xml version="1.0" encoding="utf-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Fragment> <DirectoryRef Id="WIXUI_INSTALLDIR"> <Component Id="cmpD21EA675EFA6996C0BC35D1EBF6D2457" Guid="*"> <File Id="fil23AD96741A175261995FF2E150D0D117" KeyPath="yes" Source="$(var.SomeVar)\Bar.exe" /> </Component> <Component Id="cmp4CFE705322C198BF47866FF19D0186CC" Guid="*"> <File Id="fil75F8456D557F48D20C117E74D90A6065" KeyPath="yes" Source="$(var.SomeVar)\Baz.exe" /> </Component> <Component Id="cmp90C9500BC764786BCBA4DD0D0E134F54" Guid="*"> <File Id="fil2DB44905B644507065B8C7C6B97B2A02" KeyPath="yes" Source="$(var.SomeVar)\Foo.exe" /> </Component> </DirectoryRef> </Fragment> <Fragment> <ComponentGroup Id="ComponentGroup.Service"> <ComponentRef Id="cmpD21EA675EFA6996C0BC35D1EBF6D2457" /> <ComponentRef Id="cmp4CFE705322C198BF47866FF19D0186CC" /> <ComponentRef Id="cmp90C9500BC764786BCBA4DD0D0E134F54" /> </ComponentGroup> </Fragment> </Wix> I need to apply a transform to re-order the DirectoryRef child elements such that Component/File[@Source="$(var.SomeVar)\Foo.exe"] appears first. I am not really clear on the semantics of template and copy actions as well as template specificity. The following omits the outer Component elements from the File elements; <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:output encoding="UTF-8" indent="yes" method="xml" /> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="//wix:DirectoryRef[@Id = 'WIXUI_INSTALLDIR']"> <xsl:copy> <xsl:apply-templates select="@*" /> <xsl:apply-templates select="//wix:Component/wix:File[@Id = '$(var.SomeVar)\Foo.exe']" /> <xsl:apply-templates select="//wix:Component/wix:File[@Id != '$(var.SomeVar)\Foo.exe']" /> </xsl:copy> </xsl:template> </xsl:stylesheet> Any idea what I am missing? Thanks, jlc XSL-List info and archive EasyUnsubscribe (by email)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Transform help, Joseph L. Casale jca | Thread | Re: [xsl] Transform help, Peter Flynn peter@xx |
Re: [xsl] Transform help, Joseph L. Casale jca | Date | Re: [xsl] Transform help, Peter Flynn peter@xx |
Month |