Xml XSLT基于ID将元素移动到另一个元素中
我有以下xml:Xml XSLT基于ID将元素移动到另一个元素中,xml,xslt,xsd,Xml,Xslt,Xsd,我有以下xml: <Metro> <MeasurementList> <Measurement> <MeasurementX> <Prop1>bla<Prop1> <AcqSettingsRef>#1212</AcqSettingsRef> <SensSettingsRef>#33</Se
<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中完成相同的工作。