Я абсолютный новичок в XSLT, и за последние пару часов с помощью Google объединил следующее. Так имейте в виду ...Слияние атрибутов с XSLT
Пример файла:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals">
<ProjectGuid>{C7D20737-FF45-4232-8461-34C6B5B9D1E5}</ProjectGuid>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<Import Project="toinline.proj" />
</Project>
toinline.proj
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets="Stuff">
<Stuff></Stuff>
</Project>
В общем, что я хочу сделать, это создать программу XSLT, которая делает относительно простое преобразование: Учитывая файл проекта MSBuild (который является XML-файлом), я хочу «встроить» тег верхнего уровня Import
(тег ссылается на файл с использованием относительного пути, я хочу взять содержимое тега верхнего уровня в этом файле, и замените тег на это)).
Для данного примера, я что-то вроде
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals">
<ProjectGuid>{C7D20737-FF45-4232-8461-34C6B5B9D1E5}</ProjectGuid>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<Stuff></Stuff>
</Project>
У меня есть, что работать со следующим
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msb="http://schemas.microsoft.com/developer/msbuild/2003">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Replace any 'import' tag with the contents of the project file it references.
Note that this only works with relative paths. -->
<xsl:template match="msb:Import">
<xsl:copy-of select="document(@Project)/msb:Project/*"/>
</xsl:template>
</xsl:stylesheet>
Теперь ожидаю, что проблема у меня есть, что файл, который я am inlining («toinline.proj» в образце) имеет тег верхнего уровня Project
с атрибутом InitialTargets
, который я хотел бы «объединить» в прилагаемый документ, чтобы в итоге получилось что-то вроде
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets="Stuff">
<PropertyGroup Label="Globals">
<ProjectGuid>{C7D20737-FF45-4232-8461-34C6B5B9D1E5}</ProjectGuid>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<Stuff></Stuff>
</Project>
Как я могу расширить свое решение для этого? Сейчас я могу предположить, что прилагает документ не имеет этот атрибут, но в идеале, если это было так, мы бы объединить содержимое (с помощью конкатенации точки с запятой)
При попытке вашего решения я получаю следующую ошибку от msbuild: 'ошибка MSB3704: невозможно загрузить указанный Xslt. «select» - недопустимый атрибут для элемента «xsl: attribute». Это может быть вызвано более старой версией языка? Я использую задачу 'XslTransformation' в msbuild, не уверен, какую версию она использует. – Bwmat
Это не работает - похоже, мой тег заменен на .... ничего, и я тоже не получаю атрибут. Нет ошибок, просто кажется, что '$ importee' ничего не оценивает. – Bwmat
Ох, это после использования ' xsl: attribute>' –
Bwmat