Ich setze ein XSL zusammen, als ein NAnt-Build-Skript erstellen wird, das als Eingabe eine XML-Datei verwendet, die alle Elemente definiert, die erstellt werden müssen. Wir haben viele sehr ähnliche Projekte mit Standardlayouts und definierten Standards für Handover-Bereiche. Eine XML-Datei, die definiert, was die Entwickler machen wollen, anstatt zu beschreiben, wie sie durchgeführt werden muss, würde die Akzeptanz des Build-Service erheblich verbessern.Wie neste ich xsl: for-each aus verschiedenen Teilen des XML-Dokuments?
Ich möchte schon früh im Produkt Build XML-Datei die Build-Modi definieren, verwendet werden, dh
<Build>
<BuildModes>
<Mode name="Debug" />
<Mode name="Release" />
</BuildModes>
<ItemsToBuild>
<Item name="first item" .... />
<Item name="second item" .... />
</ItemsToBuild>
</Build>
Ich möchte eine
<xsl:for-each select="/Build/BuildModes/Mode">
<xsl:for-each select="/Build/ItemsToBuild/Item">
<exec program="devenv">
<xsl:attribute name="line">
use the @name from the Mode and other stuff from Item to build up the command line
</xsl:attribute>
</xsl:for-each>
</xsl:for-each>
nun haben, ich kann es tun, indem Ich habe eine Definition zwischen den beiden für jede Zeile, um den Wert für Mode/@ name zu behalten, aber das ist ein bisschen unordentlich, und was ich eigentlich machen möchte, ist das Umdrehen der Umgebung, so dass der Build-Modus innerhalb der Item-Schleife ist Modus dann der andere. Im Moment würde es alle Debug-Builds und dann alle Release-Builds erstellen. Um das zu tun, müsste ich mehrere erklären lassen, und das wird sehr unordentlich.
So ist es verschachtelt, wenn die Elemente im Quelldokument nicht verschachtelt sind.
EDIT:
ok, wie die akzeptierte Antwort unten zeigt für-jede Verwendung in den meisten Fällen eine schlechte Idee ist, und ich habe dieses Beispiel in den folgenden überarbeitet. Es ist etwas anders, da das Schema, das ich verwende, für den obigen Beitrag vereinfacht wurde, aber Sie bekommen die Idee.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>
<xsl:template match="/BuildDefinition">
<xsl:apply-templates select="/BuildDefinition/VS2008SLN/DeploymentProject"/>
</xsl:template>
<xsl:template match="/BuildDefinition/VS2008SLN/DeploymentProject">
<xsl:apply-templates select="/BuildDefinition/BuildModes/Mode">
<xsl:with-param name="BuildTarget" select="." />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="/BuildDefinition/BuildModes/Mode">
<xsl:param name="BuildTarget" />
<exec program="devenv"> <!-- not the real call, but for example purposes -->
<xsl:attribute name="ProjectName" select="$BuildTarget/@ProjectName"/>
<xsl:attribute name="SolutionName" select="$BuildTarget/../@SolutionName" />
<xsl:attribute name="ModeName" select="@name"/>
</exec>
</xsl:template>
</xsl:stylesheet>
und das ist das Schema, gegen die es läuft
<BuildDefinition Version="1.0">
<BuildModes>
<Mode name="Debug" />
<Mode name="Release" />
</BuildModes>
<VS2008SLN
SolutionName="MySolution"
SolutionDirectory="Visual Studio 2008\MySolution">
<DeploymentProject
ProjectName="MyDeploymentProject"
DeploymentTargetDirectory="EndsUpHere"
DeploymentManifestName="AndCalledThisInTheDocumentation" />
</VS2008SLN>
Vielen Dank, wie Sie wahrscheinlich wissen können, wurde mein Wissen von xsl aus dem Ergreifen einiger Beispiele gewonnen und von dort extrapolieren. Viel mehr zu lernen. –
Wie kann ich das gleiche hier erreichen: http://stackoverflow.com/questions/26530125/how-to-use-xslt-to-display-xml-to-the-browser Danke – SearchForKnowledge
@SearchForKnowledge Ich habe mir deine Frage angeschaut . Ich habe keine Ahnung, wie das mit meiner Antwort hier zusammenhängt. – Tomalak