В следующем XSLT-извлекает COPY VALUE
строку между **
и копирует его в конце <payload>
тега. Затем строки до и после COPY VALUE
используются в качестве префиксов и постфиксных тегов <copied>
.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="payload">
<xsl:variable name="copyval" select="substring-before(substring-after(test/text(),'**'),'**')" />
<xsl:variable name="valBefore" select="substring-before(test/text(),$copyval)" />
<xsl:variable name="valAfter" select="substring-after(test/text(),$copyval)" />
<xsl:copy>
<test><xsl:value-of select="$copyval" /></test>
<xsl:apply-templates select="node()[not(self::test)]|@*" />
<xsl:value-of select="$valBefore" /><copied><xsl:value-of select="$copyval" /></copied><xsl:value-of select="$valAfter" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Я не думаю, что эти звездочки действительно есть. И я не думаю, что 'node() [local-name()! = 'Test']' является хорошей практикой - я бы использовал 'node() [not (self :: test)]'. При необходимости вообще. –
@ michael.hor257k: Я улучшил свой ответ с предложенной вами лучшей практикой. Что касается звездочек: Да, я тоже об этом подумал. Но этот вопрос был задан, и я попытался ответить на него как данность. Если автор прокомментировал бы это, я мог бы легко удалить эти строки, если это необходимо. – zx485