XSLT переместить элемент внутри другого на основе идентификатора - PullRequest
0 голосов
/ 28 июня 2018

У меня есть следующий xml:

<Metro>
<MeasurementList>
    <Measurement>
        <MeasurementX>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1212</AcqSettingsRef>
            <SensSettingsRef>#33</SensSettingsRef>
        </MeasurementX>
        <MeasurementY>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1213</AcqSettingsRef>
            <SensSettingsRef>#34</SensSettingsRef>
        </MeasurementY>
    </Measurement>
    <Measurement>
        <MeasurementX>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1212</AcqSettingsRef>
            <SensSettingsRef>#33</SensSettingsRef>
        </MeasurementX>
        <MeasurementY>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1214</AcqSettingsRef>
            <SensSettingsRef>#35</SensSettingsRef>
        </MeasurementY>
    </Measurement>
    <Measurement>
        <MeasurementX>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1215</AcqSettingsRef>
            <SensSettingsRef>#36</SensSettingsRef>
        </MeasurementX>
        <MeasurementY>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1216</AcqSettingsRef>
        </MeasurementY>
    </Measurement>
</MeasurementList>
<References>
    <AcqSettings>
        <Id>1212</Id>
        <Prop2>bla<Prop2>
    </AcqSettings>
    <AcqSettings>
        <Id>1213</Id>
        <Prop2>bla<Prop2>
    </AcqSettings>
    <AcqSettings>
        <Id>1214</Id>
        <Prop2>bla<Prop2>
    </AcqSettings>
    <AcqSettings>
        <Id>1215</Id>
        <Prop2>bla<Prop2>
    </AcqSettings>
    <AcqSettings>
        <Id>1216</Id>
        <Prop2>bla<Prop2>
    </AcqSettings>
    <SensSettings>
        <Id>33</Id>
        <Prop3>bla33<Prop3>
    </SensSettings>
    <SensSettings>
        <Id>34</Id>
        <Prop3>bla34<Prop3>
    </SensSettings>
    <SensSettings>
        <Id>35</Id>
        <Prop3>bla35<Prop3>
    </SensSettings>
    <SensSettings>
        <Id>36</Id>
        <Prop3>bla36<Prop3>
    </SensSettings>
</References>

И мне нужно переместить «SensSettings» из его собственного элемента в «AcqSettings» на основе отношения ID, которое имеет «MeasurementX или MeasurementY». SensSettings может отсутствовать для некоторых.

Результат xml должен выглядеть следующим образом:

<Metro>
<MeasurementList>
    <Measurement>
        <MeasurementX>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1212</AcqSettingsRef>
        </MeasurementX>
        <MeasurementY>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1213</AcqSettingsRef>
        </MeasurementY>
    </Measurement>
    <Measurement>
        <MeasurementX>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1212</AcqSettingsRef>
        </MeasurementX>
        <MeasurementY>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1214</AcqSettingsRef>
        </MeasurementY>
    </Measurement>
    <Measurement>
        <MeasurementX>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1215</AcqSettingsRef>
        </MeasurementX>
        <MeasurementY>
            <Prop1>bla<Prop1>
            <AcqSettingsRef>#1216</AcqSettingsRef>
        </MeasurementY>
    </Measurement>
</MeasurementList>
<References>
    <AcqSettings>
        <Id>1212</Id>
        <Prop2>bla<Prop2>
        <Prop3>bla33<Prop3>
    </AcqSettings>
    <AcqSettings>
        <Id>1213</Id>
        <Prop2>bla<Prop2>
        <Prop3>bla34<Prop3>
    </AcqSettings>
    <AcqSettings>
        <Id>1214</Id>
        <Prop2>bla<Prop2>
        <Prop3>bla35<Prop3>
    </AcqSettings>
    <AcqSettings>
        <Id>1215</Id>
        <Prop2>bla<Prop2>
        <Prop3>bla36<Prop3>
    </AcqSettings>
    <AcqSettings>
        <Id>1216</Id>
        <Prop2>bla<Prop2>
    </AcqSettings>
</References>

Это должно быть сделано с помощью XSLT-преобразования. Пока я не уверен, как связать SensSettings с AcqSettings на основе идентификатора в измерении.

1 Ответ

0 голосов
/ 28 июня 2018

Используя две клавиши, вы можете перейти по ссылке и скопировать указанный элемент:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:key name="mes-ref" match="MeasurementX | MeasurementY" use="substring(AcqSettingsRef, 2)"/>
  <xsl:key name="setting" match="SensSettings" use="Id"/>

  <xsl:template match="AcqSettings">
      <xsl:copy>
          <xsl:apply-templates/>
          <xsl:copy-of select="key('setting', key('mes-ref', Id)/SensSettingsRef/substring(., 2))/Prop3"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="SensSettings"/>

</xsl:stylesheet>

Онлайн на https://xsltfiddle.liberty -development.net / bFDb2Cg , используйте XSLT 3, но использование xsl:mode можно заменить в XSLT 2, указав преобразование идентичности.

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