xslt: синтаксический анализ текста с помощью тега

#xml #xslt

#xml #xslt

Вопрос:

У меня есть такой xml:

 <main>
 text1 <tag>2</tag> text3
</main>
  

должен быть преобразован с помощью XSLT в:

 <newMain>
 text1 <tag2>2</tag2>text3
</newMain>
  

но я не знаю, как его получить.
Вы можете мне помочь?

Спасибо

Ранд

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

1. Вы хотите сделать это для данного конкретного случая? Или 2 в main2 получает свое значение из содержимого тега?

2. извините, моя ошибка: main2 и ‘2’ никак не связаны. Я изменил приведенный выше xml.

Ответ №1:

 <xsl:template match="main | tag">
  <xsl:element name="{name()}2">
    <xs:apply-templates/>
  </xsl:element>
</xsl:template>
  

должно быть достаточно, если вы просто хотите добавить «2» к имени элементов. Если вы хотите взять номер элемента «tag» из содержимого, выполните, например

     <xsl:template match="main">
      <xsl:element name="{name()}2">
        <xs:apply-templates/>
      </xsl:element>
    </xsl:template>

<xsl:template match="tag">
  <xsl:element name="{name()}{.}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>
  

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

1. извините, моя ошибка: main2 и ‘2’ никак не связаны. Я изменил приведенный выше xml.

Ответ №2:

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

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:reps>
  <rep old="main" new="newMain"/>
  <rep old="tag" new="tag2"/>
 </my:reps>

 <xsl:variable name="vReps" select="document('')/*/my:reps/*"/>

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

 <xsl:template match=
  "*[name() = document('')/*/my:reps/*/@old]">

 <xsl:element name="{$vReps[@old = name(current())]/@new}">
  <xsl:apply-templates select="node()|@*"/>
 </xsl:element>
 </xsl:template>
</xsl:stylesheet>
  

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

 <main>
 text1 <tag>2</tag> text3
</main>
  

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

 <newMain>
 text1 <tag2>2</tag2> text3
</newMain>