Проблема в том, что мой вывод имеет
элемент дважды:
<?xml version="1.0"?>
<Config>
<Enabled>false</Enabled>
<Interval><Interval>77</Interval></Interval>
</Config>
Не соответствует действительности!
Выходные данные, когда это преобразование применяется к предоставленному XML-документу:
<Config>
<Enabled>false</Enabled>
<PollingInterval><Interval>77</Interval></PollingInterval>
</Config>
Если вы хотите избавиться от какого-либо элемента, просто удалите соответствующую инструкцию <xsl:element>
.
Например : удаление <xsl:element name="PollingInterval">
, преобразование становится:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Config/Interval">
<xsl:element name="Interval">77</xsl:element>
</xsl:template>
</xsl:stylesheet>
и результат применения его к предоставленному документу XML: :
<Config>
<Enabled>false</Enabled>
<Interval>77</Interval>
</Config>
Рекомендую еще больше упростить преобразование и сопоставить на текстовом узле дочерний элемент Interval
. Возможно, это самое короткое и простое решение :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Interval/text()">
<xsl:text>77</xsl:text>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<Config>
<Enabled>false</Enabled>
<Interval>5</Interval>
</Config>
желаемый результат получен :
<Config>
<Enabled>false</Enabled>
<Interval>77</Interval>
</Config>
Если у вас много элементов Interval
и вы хотите заменить значение 5
на 77
, то единственным шаблоном, кроме правила идентификации, должно быть:
<xsl:template match="Interval/text()[.=5]">
<xsl:text>77</xsl:text>
</xsl:template>