Я новичок в XSLT и хочу удалить все «частные» теги из ссылок в файле csproj, а затем ввести Private = «False» теги за каждым «HintPath». Я написал рабочее решение, что без полного понимания того, что я делаю:Соответствие выражениям XPATH = «TAGNAME» соответствует, но соответствует = «PARENT/TAGNAME» не
XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:DUMMY="http://schemas.microsoft.com/developer/msbuild/2003"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- use DUMMY namespace as default, would otherwise write missing ns explicitly -->
<xsl:output encoding="UTF-8" indent="yes"/> <!-- encoding as required for output file, indent=yes: would write all text in one line otherwise -->
<xsl:strip-space elements="*"/> <!-- delete all white spaces -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Private"/> <!-- obsolete line: without the namespace workaround: no match -->
<xsl:template match="DUMMY:Private"/> <!-- working line: only deletes tags itself, not indention -->
<xsl:template match="DUMMY:Reference/Private"/> <!-- obsolete line: Does not match! -->
<xsl:template match="DUMMY:Reference//Private"/> <!-- obsolete line: Does also not match! -->
<xsl:template match="DUMMY:HintPath">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
<xsl:element name="Private">
<xsl:text>False</xsl:text>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Пример входного файла:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- The original document has an anonymous default namespace -->
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<ItemGroup>
<Reference Include="Configuration">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(SolutionDir)..\..\public\Bin\$(Configuration)\Configuration.dll</HintPath>
</Reference>
<Reference Include="Core">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(SolutionDir)..\..\public\Bin\$(Configuration)\Core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Data">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(SolutionDir)..\..\public\Bin\$(Configuration)\Data.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
</Project>
Как сказано: что работает для меня, но это было довольно сложно обнаружить до сих пор. Есть ли лучший способ выполнить эту задачу с помощью XSLT?
Мне не нравится тот факт, что может возникнуть сопутствующий ущерб, если «Частные» теги появляются в другом месте документа, чем в «Справочнике». Но я не нашел способа указать его, включая этот родительский тег. Любые намеки?
Второй вопрос: существует ли более простой способ обработки пространств имен?
Любые предложения приветствуются.