Добавить новое пространство имен в некорневой узел в XSLT 1.0 - PullRequest
0 голосов
/ 26 сентября 2019

Я видел сообщение XSLT: Добавить объявление пространства имен к корневому элементу

Ответ @StuartLC работает.Мне нужна помощь ... в примере @schglurps ... ¿Как бы вы добавили новое пространство имен в некорневой узел?

Входной XML-документ:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="AcquisitionFolder">
            <Directory Id="dir2EE87E668A6861A2C8B6528214144568" Name="bin" />
            <Directory Id="dir99C9EB95694B90A2CD31AD7E2F4BF7F6" Name="Decoders" />
        </DirectoryRef>
    </Fragment>
</Wix>

ИЯ хотел бы получить:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="AcquisitionFolder" xmlns:ns1="http://prerk">
            <Directory Id="dir2EE87E668A6861A2C8B6528214144568" Name="bin" />
            <Directory Id="dir99C9EB95694B90A2CD31AD7E2F4BF7F6" Name="Decoders" />
            <ns1:dir>prueba</ns1:dir>
        </DirectoryRef>
    </Fragment>
</Wix>

Новое пространство имен в узле DirectoryRef (например) xmlns:ns1="http://prerk", оно не является корнем и копирует все те же узлы.

Я пытался, но не смог найти подходящего решения.

Не могли бы вы мне посоветовать?

1 Ответ

1 голос
/ 26 сентября 2019

Вы можете получить ожидаемый результат, используя:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
exclude-result-prefixes="wix">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="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="wix:DirectoryRef">
     <DirectoryRef xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:ns1="http://prerk">
        <xsl:apply-templates select="@*|node()"/>
         <ns1:dir>prueba</ns1:dir>
    </DirectoryRef>
</xsl:template>

</xsl:stylesheet>

Хотя это может быть проще сделать просто:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
exclude-result-prefixes="wix">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="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="wix:DirectoryRef">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <ns1:dir xmlns:ns1="http://prerk">prueba</ns1:dir>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

для получения семантически идентичного результата:

<?xml version="1.0" encoding="utf-16"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <DirectoryRef Id="AcquisitionFolder">
      <Directory Id="dir2EE87E668A6861A2C8B6528214144568" Name="bin" />
      <Directory Id="dir99C9EB95694B90A2CD31AD7E2F4BF7F6" Name="Decoders" />
      <ns1:dir xmlns:ns1="http://prerk">prueba</ns1:dir>
    </DirectoryRef>
  </Fragment>
</Wix>
...