Динамическая передача атрибута узла XML на основе условия другому узлу с использованием XSLT - PullRequest
0 голосов
/ 29 мая 2018

У меня большой XML-файл, в котором есть 2 очень похожих узла.На основе значения из 1-го узла мне нужно удалить ненужные повторы второго узла.

Пример XML:

<ABC>
    <Project>
        <ProjectBaselines>
            <Baseline current="true" ID="01" />
            <Baseline current="false" ID="02" />
            <Baseline current="false" ID="03" />
        </ProjectBaselines>
    </Project>
    <Tasks>
        <Task>
            <Bline ID="01" />
            <Bline ID="02" />
            <Bline ID="03" />
            <Bline ID="04" />
        </Task>
    </Tasks>
</ABC>

XSLT:

<xsl:template match="Baseline[@current !='true']"/>
<xsl:template match="Bline[@ID != *ID of the Baseline node where current=true*]" />

С первой строкой XSLT я могу удалить все узлы <Baseline>, где ток равен false;однако я не могу найти способ передать значение идентификатора из тега <Baseline>, где current=true.

1 Ответ

0 голосов
/ 29 мая 2018

Используйте ключ для поиска элементов Baseline по их атрибуту ID

<xsl:key name="Baselines" match="Baseline" use="@ID" />

Тогда ваш шаблон соответствует элементам Bline, где эквивалентный Baseline равен true, это ....

<xsl:template match="Bline[key('Baselines', @ID)/@current = 'true']" />

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*" />

  <xsl:key name="Baselines" match="Baseline" use="@ID" />

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

  <xsl:template match="Baseline[@current !='true']"/>

  <xsl:template match="Bline[key('Baselines', @ID)/@current = 'true']" />
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...