Почему элемент появляется дважды после преобразования? - PullRequest
2 голосов
/ 05 августа 2010

Я работаю с Perl и XSL.Я пытаюсь изменить значение <Interval> на некоторое число в файле XML.Мой XML выглядит следующим образом:

<?xml version="1.0"?>
<Config>
    <Enabled>false</Enabled>
    <Interval>5</Interval>
</Config>

Мой XSL выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<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="PollingInterval">
    <xsl:element name="Interval">77</xsl:element>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

Проблема состоит в том, что мой вывод имеет элемент <Interval> дважды:

<?xml version="1.0"?>
<Config>
    <Enabled>false</Enabled>
    <Interval><Interval>77</Interval></Interval>
</Config>

Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Проблема в том, что мой вывод имеет элемент дважды:

<?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>
1 голос
/ 05 августа 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Interval/text()">77</xsl:template>
</xsl:stylesheet>

Выход:

<Config>
    <Enabled>false</Enabled>
    <Interval>77</Interval>
</Config>

Примечание : Если вы опубликуете другой входной пример и опишите привязку, мы могли бы показать вам, как извлечь новый номер.

РЕДАКТИРОВАТЬ : короче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...