#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>