Выбор узлов на основе значения атрибута узла-сиблинга, выбранного дочерним элементом сиблинга - PullRequest
0 голосов
/ 27 декабря 2018

Относительно новый для XSLT.Я взял урок и, похоже, овладеваю им, но он меня озадачил.

В моей организации есть сторонняя система, которая генерирует выходные данные XML в разное время.У нас есть утилита, которая применяет XSLT и передает ее другим организациям, которым требуется эта информация.Сгенерированный XML имеет раздел, структурированный, как показано ниже, со связанными данными, содержащимися в узлах NodeType1 и NodeType2.

Новая информация, которую мы должны отправить первым целевым узлам NodeType1, в которых значение TargetElement равно true.Затем нам нужно выбрать узлы NodeType2, где их значение атрибута ConID совпадает со значениями атрибута ConID для тех узлов NodeType1, которые были выбраны.В приведенном примере должны быть выбраны те узлы NodeType2, у которых значения атрибутов ConID равны 123456 и 964589.

Так что я попробовал несколько комбинаций условий безуспешно.Последнее, что я попробовал, выглядит так:

<xsl:apply-template select="NodeType2[./NodeType2/Container/Connection/@ConID = ../NodeType1/Container/Connection[TargetNode = 'True']/Connection/@ConID]

Я уже столько раз прошел через это, что не могу сказать наверняка, что еще я пробовал

Любая помощь будет оченьоценили в этот момент.

<?xml version = "1.0" encoding = "utf-8"?>
<Section>
    <NodeType1>
        <Container>
            <TargetElement>True</TargetElement>
            <Connection ConID="123456"></Connection>
        </Container>
      </NodeType1>
      <NodeType1>
        <Container>
            <Connection ConID="999999"></Connection>
        </Container>
      </NodeType1>
      <NodeType1>
        <Container>
        <TargetElement>True</TargetElement>
        <Connection ConID="964589"></Connection>
    </Container>
  </NodeType1>
  <NodeType2>
    <Container>
        <NameInformation>
            <First>Jo</First>
            <Last>Shmo</Last>
        </NameInformation>
        <Connection ConID="123456"></Connection>
    </Container>
  </NodeType2>
  <NodeType2>
    <Container>
        <NameInformation>
            <First>Who</First>
            <Last>First</Last>
        </NameInformation>
        <Connection ConID="999999"></Connection>
    </Container>
  </NodeType2>
  <NodeType2>
    <Container>
        <NameInformation>
            <First>What</First>
            <Last>Second</Last>
        </NameInformation>
        <Connection ConID="964589"></Connection>
    </Container>
  </NodeType2>

1 Ответ

0 голосов
/ 27 декабря 2018

У вас есть перекрестная ссылка, а XSLT имеет специальную функцию для разрешения перекрестных ссылок с именем keys .

Рассмотрим следующий пример:

XSLT 1.0

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

<xsl:key name="type2" match="NodeType2/Container" use="Connection/@ConID" />

<xsl:template match="/Section">
    <output>
        <xsl:for-each select="NodeType1/Container[TargetElement='True']">
            <xsl:copy-of select="key('type2', Connection/@ConID)/NameInformation"/>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

Применительно к вашему примеру ввода результат будет:

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <NameInformation>
    <First>Jo</First>
    <Last>Shmo</Last>
  </NameInformation>
  <NameInformation>
    <First>What</First>
    <Last>Second</Last>
  </NameInformation>
</output>
...