Как изменить небольшую часть XML с помощью XSL - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть XML-файл с 25 элементами. Я просто хочу преобразовать 2 элемента и сохранить оставшийся XML. Может ли кто-нибудь сказать мне, как это сделать. Все примеры в Интернете изменяют XML-документ в целом, я не хочу этого. Я просто хочу изменить значения двух элементов.

Ответы [ 2 ]

8 голосов
/ 08 февраля 2012

Такие задачи решаются с помощью шаблона преобразования идентификаторов, который является

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

, а затем путем добавления шаблонов для элементов, которые необходимо изменить, например,

<xsl:template match="foo">
  <bar>
   <xsl:apply-templates select="@* | node()"/>
  </bar>
</xsl:template>

меняет foo наbar элементов и / или

<xsl:template match="foobar"/>

удаляет foobar элементов.

Чтобы дать вам еще один пример, например, если мы хотим скопировать baz элементы с их содержимым, ноЕсли вы хотите добавить элемент new, мы можем добавить шаблон

<xsl:template match="baz">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
    <new>...</new>
  </xsl:copy>
</xsl:template>

Пока вы сохраняете преобразование идентичности (с apply-templates) для всего, что вы не хотите изменять, вы можете довольнохорошо структурируйте свою таблицу стилей, написав шаблон для каждого изменяемого элемента.

0 голосов
/ 08 февраля 2012

Практический пример ниже, где я анализирую xsd-файл и удаляю из него все аннотации.

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<!-- copy all nodes and attributes -->
<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>

<!-- but remove annotations -->
<xsl:template match="xs:annotation"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...