Как использовать XSLT в сценарии поиска-замены? - PullRequest
0 голосов
/ 18 декабря 2010

У меня есть файл XML с определенными значениями в определенных местах.Я хотел бы иметь возможность заменять / добавлять / удалять значения в этих местоположениях.

Дается следующее:

  1. Все узлы атрибутов ссылок только на местоположения.
  2. Если местоположение ссылается на несуществующий узел атрибута, то узел элемента-владельца должен существовать.
  3. Новые значения известны на момент написания файла XSL.

При условииВ этих условиях я реализовал специальное решение, которое принимает список значений ключей в XAML-файле, где ключи - это XPATH, а значения - это, ну, в общем, значения, и они делают именно то, что мне нужно, только чтобы понять, что я изобрел колесокогда уже есть трансформации Ferrari - XSL.

У меня такой вопрос.Для данного XML, что такое XSL, применение которого к этому XML делает это:

  1. Заменяет значение в /a/b/@c на другое значение, скажем D.Если некоторые элементы /a/b не имеют атрибута c - его следует добавить.
  2. Удаляет атрибут /a/d/@e, если имеется.Иначе ничего не делает.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

XSLT 1.0:

<!-- the identity template copies everything not matched elsewhere -->
<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*" />
  </xsl:copy>
</xsl:template>

<!-- special handling for /a/b elements -->
<xsl:template match="/a/b">
  <!-- copy the element itself -->
  <xsl:copy>
    <!-- handle all attributes -->
    <xsl:apply-templates select="@*" />
    <!-- create (or overwrite!) an attribute named "c" -->
    <xsl:attribute name="c">
      <xsl:value-of select="'D'" />
    </xsl:attribute>
    <!-- handle all other child nodes -->
    <xsl:apply-templates select="node()" />
  </xsl:copy>
</xsl:template>

<!-- empty template to delete /a/d/@e -->
<xsl:template match="/a/d/@e" />
0 голосов
/ 18 декабря 2010

Я полагаю, что вы, возможно, немного осмысливаете XSL здесь.Звучит так, как будто вы представляете это процедурно, т. Е. «Как мне выразить« Делать X в Y »», а не «Что является отображением из структуры X в структуру Y», каковым является XSL.

Вам понадобится что-то вроде:

<xsl:for-each select="//a">
    <xsl:copy>
        <xsl:for-each select="b">
            <xsl:copy>
                <xsl:attribute name="c">
                    <xsl:value-of select="$D"/> 
                </xsl:attribute> 
            </xsl:copy>
        </xsl:for-each
    </xsl:copy>
</xsl:for-each>

(Примечание: синтаксис «$ D» указывает на разыменование переменной, т.е. «вставьте значение переменной D». Я предполагаю, что это то, что вы хотите, новы можете получить D откуда угодно.)

Итак, вам не нужно указывать XSL «добавить c» или «удалить e».Вы говорите ему, что должно быть там, а иначе ничего не происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...