Переименование узлов и значений с помощью xslt - PullRequest
3 голосов
/ 11 февраля 2011

Я новичок в 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 ]

11 голосов
/ 11 февраля 2011
<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>
0 голосов
/ 17 августа 2017

Это также может сработать, но я думаю, что другой ответ лучше. Просто подумал, что предложу свои два цента.

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...