Как заменить тег другим тегом в xml с помощью xsl

#xslt

#xslt

Вопрос:

Мой XML-файл выглядит следующим образом.

 <rule>  
  <name>86</name>
  <ruleId>100</ruleId>
  <ruleVersion>1.0</ruleVersion>
  <brlVersion>1.0</brlVersion>
</rule>
  

Мне нужно заменить name на brlName, и мне нужно добавить другой тег в качестве drlName.Результат должен выглядеть следующим образом.

 <rule>  
  <brlName>86</brlName>
  <ruleId>100</ruleId>
  <ruleVersion>1.0</ruleVersion>
  <brlVersion>1.0</brlVersion>
  <drlName>86_1.0</drlName>
</rule>
  

Пожалуйста, помогите мне с соответствующим xsl, чтобы получить желаемый результат.
Ценю вашу помощь!

Комментарии:

1. Хороший вопрос, 1. Смотрите мой ответ для получения полного, короткого и простого решения, основанного на самом фундаментальном и мощном шаблоне проектирования XSLT — использовании и переопределении правила идентификации / шаблона.

2. Почему некоторые люди задают вопросы и, получив, позвольте мне сказать, хорошие ответы, не предоставляют никакой обратной связи? Иногда это очень раздражает.

3. Добро пожаловать в Stack Overflow, empo.

Ответ №1:

Это типичная задача для преобразования идентификатора (первое правило шаблона в приведенном ниже преобразовании). Всего два переопределения (последние два правила).


XSLT 1.0 протестирован под Saxon 6.5.5

 <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="name">
        <brlName><xsl:value-of select="."/></brlName>
    </xsl:template>

    <xsl:template match="brlVersion">
        <xsl:copy-of select="."/>
        <drlName><xsl:value-of select="preceding-sibling::name"/>_1.0</drlName>
    </xsl:template>

</xsl:stylesheet>
  

Ответ №2:

Это преобразование:

 <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()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="name">
  <brlName><xsl:apply-templates select="node()|@*"/></brlName>
 </xsl:template>

 <xsl:template match="/*/*[last()]">
  <xsl:call-template name="identity"/>
   <drlName>86_1.0</drlName>
 </xsl:template>
</xsl:stylesheet>
  

при применении к предоставленному XML-документу:

 <rule>
    <name>86</name>
    <ruleId>100</ruleId>
    <ruleVersion>1.0</ruleVersion>
    <brlVersion>1.0</brlVersion>
</rule>
  

выдает желаемый, правильный результат:

 <rule>
   <brlName>86</brlName>
   <ruleId>100</ruleId>
   <ruleVersion>1.0</ruleVersion>
   <brlVersion>1.0</brlVersion>
   <drlName>86_1.0</drlName>
</rule>
  

Объяснение:

  1. Использование и переопределение правила идентификации / шаблона — наиболее фундаментального и мощного шаблона проектирования XSLT.

  2. Переопределение любого элемента с именем name и создание элемента с именем brlName (переименовать).

  3. Переопределить последний дочерний элемент верхнего элемента. Вызов правила идентификации по имени для этого узла (копирование) и затем создание элемента с именем drlName с определенным дочерним текстовым узлом в соответствии с требованиями.

Использование и переопределение правила идентификации / шаблона является наиболее фундаментальным и мощным шаблоном проектирования XSLT. Вы можете узнать больше об этом здесь.