Как заменить тег другим тегом в xml, используя xsl - PullRequest
6 голосов
/ 24 мая 2011

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 24 мая 2011

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


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>
3 голосов
/ 18 ноября 2011

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

<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.Вы можете узнать больше об этом здесь .

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