Сохранять расположение xmlns при работе процессора XSL в файле XML - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу добавить узел в документ XML с помощью xslt.Я использую 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>

Необходимо избегать этого.Как я могу только добавить узел без изменения структуры?Кроме того, я хотел бы вставить новый узел, как и другие узлы.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Не ясно, каков ваш ожидаемый результат.

Если вы хотите сохранить исходное пространство имен и вставить в него новый элемент, выполните:

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>
0 голосов
/ 15 февраля 2019

Для предоставленного вами ввода шаблоны можно переписать следующим образом:

<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>, если пространство имен не будет добавлено к этому узлу.,(специально для этого случая с данным шаблоном)

...