Переименование узлов и значений с помощью xslt
Я новичок в xslt, и у меня есть задача, с которой я не совсем уверен, куда идти. Я хочу переименовать узлы, но сохранить формат всех объявлений узлов. В реальном контексте, к которому я буду применять это, я буду делать серию таких переименований, но для краткости, образец, который я написал, включает в себя только переименование одного узла. Я использую XSL 1.0.
Ввод:
<variables>
<var>
<RENAME> a </RENAME>
</var>
<var RENAME='b'/>
<var>
<DO_NOT_TOUCH> c </DO_NOT_TOUCH>
</var>
<var DO_NOT_TOUCH='d'/>
</variables>
Желаемый Результат:
<variables>
<var>
<DONE> a </DONE>
</var>
<var DONE='b'/>
<var>
<DO_NOT_TOUCH> c </DO_NOT_TOUCH>
</var>
<var DO_NOT_TOUCH='d'/>
</variables>
Мой xslt:
<xsl:template match="RENAME">
<RENAMED>
<xsl:apply-templates select="@*|node()"/>
</RENAMED>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Ток Вывод
<variables>
<var>
<RENAMED> a </RENAMED>
</var>
<var RENAME="b">
</var>
<var>
<DO_NOT_TOUCH> c </DO_NOT_TOUCH>
</var>
<var DO_NOT_TOUCH="d">
</var>
</variables>
2 ответа:
<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="RENAME"> <DONE> <xsl:apply-templates select="@* | node()"/> </DONE> </xsl:template> <xsl:template match="@RENAME"> <xsl:attribute name="DONE"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> </xsl:stylesheet>
Вывод по вашему образцу:
<variables> <var> <DONE> a </DONE> </var> <var DONE="b"></var> <var> <DO_NOT_TOUCH> c </DO_NOT_TOUCH> </var> <var DO_NOT_TOUCH="d"></var> </variables>
Это тоже может сработать, но я считаю, что другой ответ лучше. Просто решил предложить свои два цента.
<xsl:variable name="Foo" select="DONE"/> <variables> <var> <xsl:element name="{$Foo}"> a </xsl:element> </var> <var DONE='b'/> <var> <DO_NOT_TOUCH> c </DO_NOT_TOUCH> </var> <var DO_NOT_TOUCH='d'/> </variables>