我想使用xslt将节点添加到XML文档。我正在使用msxsl作为处理器。 XML文档具有以下结构:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PlatformShortName>SDK_NAME</PlatformShortName>
</PropertyGroup>
</Project>
XSL规则插入所需的节点:
(编辑:添加了XSL命名空间)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="http://schemas.microsoft.com/developer/msbuild/2003"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
exclude-result-prefixes="ms">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="ms:Project/ms:PropertyGroup">
<PropertyGroup>
<xsl:element name="PlatformInstructionSet">AMRv7</xsl:element>
<xsl:apply-templates/>
</PropertyGroup>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
但是结果将名称空间属性从Project
移到了PropertyGroup
。
(编辑:我希望Project
和PropertyGroup
与输入相同。)
<Project>
<PropertyGroup xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PlatformInstructionSet>AMRv7</PlatformInstructionSet>
<PlatformShortName>SDK_NAME</PlatformShortName>
</PropertyGroup>
</Project>
有必要避免它。如何仅添加节点而不更改结构?另外,我想像其他节点一样插入新节点。
答案 0 :(得分:0)
对于您提供的输入,可以将模板重写如下:
<xsl:template match="ms:Project/ms:PropertyGroup">
<PropertyGroup xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<xsl:element name="PlatformInstructionSet">AMRv7</xsl:element>
<xsl:apply-templates />
</PropertyGroup>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="http://schemas.microsoft.com/developer/msbuild/2003">
<xsl:apply-templates select="node() | @*"/>
</xsl:element>
</xsl:template>
注意:
在xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
中添加<PropertyGroup>
会认为它的子级与父级位于同一命名空间中,因此不会将其添加到子级节点中。
如果未将命名空间添加到此节点,它将在xmlns=""
中添加<PropertyGroup>
。 (特别是在使用给定模板的情况下)
答案 1 :(得分:0)
目前尚不清楚您的预期输出是多少。
如果要保留原始名称空间并将新元素插入其中,请执行以下操作:
XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="http://schemas.microsoft.com/developer/msbuild/2003"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
exclude-result-prefixes="ms">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ms:PropertyGroup">
<xsl:copy>
<PlatformInstructionSet>AMRv7</PlatformInstructionSet>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果要完全删除名称空间,请执行以下操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="http://schemas.microsoft.com/developer/msbuild/2003"
exclude-result-prefixes="ms">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="ms:PropertyGroup">
<PropertyGroup>
<PlatformInstructionSet>AMRv7</PlatformInstructionSet>
<xsl:apply-templates/>
</PropertyGroup>
</xsl:template>
</xsl:stylesheet>