Дублируйте и манипулируйте элементами xml через xslt за один шаг - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу скопировать некоторые части (между критериями) xml и манипулировать некоторыми значениями в скопированных частях за один шаг.Вот что нужно сделать:

  1. Искать TextSymbol [SymbolKey> = 2000 AND <= 3000] </li>
  2. Копировать соответствующий узел TextSymbol
  3. Обновить значение SymbolKey вскопированный узел с префиксом 92

Вот мой исходный код xml:

<?xml version="1.0" encoding="UTF-8"?>
<TextSymbols>
    <TextSymbol>
        <SymbolKey>1000</SymbolKey>
        <Name>PHY</Name>
    </TextSymbol>
    <TextSymbol>
        <SymbolKey>2000</SymbolKey>
        <Name>LEX</Name>
    </TextSymbol>
    <TextSymbol>
        <SymbolKey>3000</SymbolKey>
        <Name>TIR</Name>
    </TextSymbol>
</TextSymbols>

Цель:

<?xml version="1.0" encoding="UTF-8"?>
<TextSymbols>
    <TextSymbol>
        <SymbolKey>1000</SymbolKey>
        <Name>PHY</Name>
    </TextSymbol>
    <TextSymbol>
        <SymbolKey>2000</SymbolKey>
        <Name>LEX</Name>
    </TextSymbol>
    <TextSymbol>
        <SymbolKey>3000</SymbolKey>
        <Name>TIR</Name>
    </TextSymbol>
    <TextSymbol>
        <SymbolKey>922000</SymbolKey>
        <Name>LEX</Name>
    </TextSymbol>
    <TextSymbol>
        <SymbolKey>923000</SymbolKey>
        <Name>LEX</Name>
    </TextSymbol>
</TextSymbols>

Спасибо заранее

1 Ответ

0 голосов
/ 14 февраля 2019

Вы должны написать скрипт следующим образом:

  1. Соответствие шаблону TextSymbols следует:

    • Применять шаблоны так же, как шаблон идентификации.
    • Затем примените шаблоны снова, но только для TextSymbol с SymbolKey в нужном диапазоне в «специальном» (prepend) режиме.
  2. Должен существовать шаблон, соответствующий SymbolKey в режиме prepend, который записывает в вывод «92» (строка, которую нужно добавить), а затем в свое собственное значение.

  3. И еще два расширения идентификационного шаблона .Он должен:

    • быть выполнен в всех режимах (mode="#all).
    • Содержащийся apply-templates должен сохранять текущий режим (mode="#current")

Таким образом, весь сценарий может выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />

  <xsl:template match="TextSymbols">
    <xsl:copy>
      <xsl:apply-templates/>
      <xsl:apply-templates mode="prepend"
        select="TextSymbol[number(SymbolKey) ge 2000 and number(SymbolKey) le 3000]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="SymbolKey" mode="prepend">
    <xsl:copy><xsl:value-of select="concat('92', .)"/></xsl:copy>
  </xsl:template>

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

Рабочий пример см. http://xsltransform.net/gVAjbSY

И примечаниеотносительно ожидаемого результата:

Вы ничего не написали об изменении содержимого Name элементов, поэтому я предполагаю, что этот элемент в последнем выводе TextSymbol должен быть TIR (как во входных данных), а не LEX.

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