2016-11-02 5 views
1

Я абсолютный новичок в 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> 

Как я могу расширить свое решение для этого? Сейчас я могу предположить, что прилагает документ не имеет этот атрибут, но в идеале, если это было так, мы бы объединить содержимое (с помощью конкатенации точки с запятой)

ответ

1

Объявите глобальную переменный, связанные с ссылочным документом:

<xsl:variable name="importee" select="document(//Import/@Project)"/> 

Затем используйте это в существующем правиле шаблона:

<xsl:template match="msb:Import"> 
    <xsl:copy-of select="$importee/msb:Project/*"/> 
</xsl:template> 

и добавьте еще правило шаблона:

<xsl:template match="msb:Projects"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:attribute name="InitialTargets" select="$importee/msb:Projects/@InitiaTargets"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

PS: Я должен был упомянуть, что xsl:attribute/@select - синтаксис XSLT 2.0. Если у вас есть несчастье использовать 1.0, вам нужен xsl: атрибут с xsl: значение дочерней инструкции. В сообщениях SO всегда указывайте, какую версию вы используете, поскольку решение может иногда отличаться.

+0

При попытке вашего решения я получаю следующую ошибку от msbuild: 'ошибка MSB3704: невозможно загрузить указанный Xslt. «select» - недопустимый атрибут для элемента «xsl: attribute». Это может быть вызвано более старой версией языка? Я использую задачу 'XslTransformation' в msbuild, не уверен, какую версию она использует. – Bwmat

+0

Это не работает - похоже, мой тег заменен на .... ничего, и я тоже не получаю атрибут. Нет ошибок, просто кажется, что '$ importee' ничего не оценивает. – Bwmat

+0

Ох, это после использования ' ' – Bwmat

Смежные вопросы