Xml XSLT基于ID将元素移动到另一个元素中

Xml XSLT基于ID将元素移动到另一个元素中,xml,xslt,xsd,Xml,Xslt,Xsd,我有以下xml: <Metro> <MeasurementList> <Measurement> <MeasurementX> <Prop1>bla<Prop1> <AcqSettingsRef>#1212</AcqSettingsRef> <SensSettingsRef>#33</Se

我有以下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>

布拉
#1212
#33
布拉
#1213
#34
布拉
#1212
#33
布拉
#1214
#35
布拉
#1215
#36
布拉
#1216
1212
布拉
1213
布拉
1214
布拉
1215
布拉
1216
布拉
33
布拉33
34
bla34
35
bla35
36
喋喋不休

我必须根据“MeasurementX或MeasurementY”所具有的ID关系,将“SensSettings”从“AcqSettings”中自己的元素中移出。某些用户可能缺少传感器设置

结果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>

布拉
#1212
布拉
#1213
布拉
#1212
布拉
#1214
布拉
#1215
布拉
#1216
1212
布拉
布拉33
1213
布拉
bla34
1214
布拉
bla35
1215
布拉
喋喋不休
1216
布拉


这应该通过XSLT转换来完成。目前,我不确定如何根据测量中的ID将SensSettings链接到AcqSettings。

使用两个键,您可以跟随参考并复制参考元素:

<?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>


在线使用XSLT 3,但XSLT 2中的
xsl:mode
可以通过拼写标识转换来替代。

一般来说,要遵循交叉引用,可以使用
xsl:key
key
函数,或者,如果使用支持模式的XSLT 2或3,也可以将问题标记为
xsd
,您可以利用架构中的
xs:ID
/
xs:IDREF
声明。对于您的具体示例,请确保提供格式良好的XML,我担心在您当前的示例中有许多元素没有正确关闭,例如
bla
是的,我很快制作了此示例XML,但忘记关闭一些标记。恐怕无法使用架构感知。将尝试使用xsl:key这是一个很好的修复,但这意味着使用版本2或3。。。在版本1中有什么我可以做的吗?如果
key('mes-ref',Id)/SensSettingsRef
总是只找到一个元素(取决于您的示例数据),那么使用
就足够了,而且希望XSLT/XPath 1兼容。如果第一个表达式可以返回多个元素,那么我认为您需要
,它应该在XSLT1中完成相同的工作。