使用元素和属性展平xml
这只是我的第二个XSLT,我一直在做它,但它仍然非常绿色 我有这样的xml:使用元素和属性展平xml,xml,xslt,Xml,Xslt,这只是我的第二个XSLT,我一直在做它,但它仍然非常绿色 我有这样的xml: <?xml version="1.0" encoding="utf-8"?> <cyber:AOI_INFO xmlns:cyber="http://www.cyberoptics.com/AOI/measure" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:schemaLocation="http://www.cybe
<?xml version="1.0" encoding="utf-8"?>
<cyber:AOI_INFO xmlns:cyber="http://www.cyberoptics.com/AOI/measure"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xsi:schemaLocation="http://www.cyberoptics.com/AOI/measure c:/xml/Measure.xsd">
<UserName>Machine1\User</UserName>
<SystemId>MACHINE1</SystemId>
<AOIVersion>4.2.1.24</AOIVersion>
<InspectionType>Inspection</InspectionType>
<PositionUnit>Millimeter</PositionUnit>
<RotationUnit>Degree</RotationUnit>
<XYOffsetReference>FeatureOrientation</XYOffsetReference>
<CoplanarityUnit>Angle</CoplanarityUnit>
<Panel Id="4" Name="Panel" PanelStatus="Failed" StartTime="07/09/2018
11:25:53" EndTime="07/09/2018 11:27:40" CycleTime="46" TotalFeatures="10804"
TotalComponents="10804" LotCode="New Lot" LotSize="0" Barcode="Failed to Read
Barcode" Code="Failed to Read Barcode" NG_Stacker_SlotNumber="">
<RecipeName>11047-01_OP10_WFR4_R2</RecipeName>
<RecipeLastUpdateTime></RecipeLastUpdateTime>
<CAD>D:\Panel.XML</CAD>
<PanelResult>
<Attributes>
<FailedBoards Value="1" />
<FailedComponents Value="16" />
<FailedFeatures Value="16" />
</Attributes>
</PanelResult>
<Feature Id="32424" Identifier="BC1" Status="Failed" Value="Failed to Read Barcode" />
<Board Id="1" Name="Board1" BoardStatus="Failed" TotalFeatures="10804" TotalComponents="10804" Barcode="" Skip="false">
<BoardResult>
<Attributes>
<FailedComponents Value="16" />
<FailedFeatures Value="16" />
</Attributes>
</BoardResult>
<Feature Id="2" Identifier="FID0" Status="Passed" />
<Feature Id="3" Identifier="FID1" Status="Passed" />
<Feature Id="4" Identifier="FID2" Status="Passed" />
<Feature Id="5" Identifier="FID3" Status="Passed" />
<Component Id="6" Name="D1" PartNumber="PAD" Package="PAD" Barcode="" IncludedInCurrentVariant="false" ComponentStatus="Passed" TotalFeatures="1">
<ComponentResult>
<Attributes>
<FailedFeatures Value="0" />
</Attributes>
</ComponentResult>
<Feature Id="21606" Identifier="Body1" FeatureStatus="Passed" FeatureInspectionInfo="" MeasurementValid="">
<FeatureResult>
<Inspection Identifier="FeatureLocator" Type="AI2" status="Passed">
<Measurements>
<ConfidenceLevel Value="95.292820242958172" Minimum="1" Maximum="100" Target="35" />
<Polarity IsFailed="false" />
</Measurements>
</Inspection>
<Inspection Identifier="X-POSITION" Type="GeometryMeasurement" status="Passed">
<Measurements>
<ParallelLine Distance="0.24886200808679954" MinDistance="0.23" MaxDistance="0.27" Angle="0.14772531447994211" MaxAngle="90" />
</Measurements>
</Inspection>
<Inspection Identifier="Pad-Gap" Type="GeometryMeasurement" status="Passed">
<Measurements>
<ParallelLine Distance="0.058603726806744492" MinDistance="0.048" MaxDistance="0.08" Angle="0.70909905503968329" MaxAngle="90" />
</Measurements>
</Inspection>
<Inspection Identifier="SR-Opening" Type="GeometryMeasurement" status="Passed">
<Measurements>
<Deviation Value="0.0340010927630135" Threshold="0.5" Type="RMS" />
<Diameter Value="0.55804347481393268" Min="0.4" Max="0.7" />
</Measurements>
</Inspection>
<Inspection Identifier="Appearance" Type="AI2" status="Passed">
<Measurements>
<ConfidenceLevel Value="94.1349731217522" Minimum="1" Maximum="100" Target="50" />
<Polarity IsFailed="false" />
</Measurements>
</Inspection>
</FeatureResult>
</Feature>
</Component>
<BoardPostMeasurementResult Result="Passed" />
</Board>
<PanelPostMeasurementResult Result="Passed" />
</Panel>
</cyber:AOI_INFO>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[parent::*]">
<xsl:element name="{local-name()}">
<xsl:for-each select="attribute::*">
<xsl:element name="{local-name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:element>
<xsl:apply-templates select="node()" />
</xsl:template>
</xsl:stylesheet>
请注意,某些父元素(如PanelResult和BoardResult)的子元素和展开属性周围没有标记
我敢肯定,让它们像应该的那样围绕它们的子属性是一件非常简单的事情。然而,我玩了很长时间,我的想法都快用完了
希望有人能认识到我在XSLT中的错误,并为我指明正确的方向
谢谢!
杰里
对不起,我想一些额外的细节会有所帮助。这就是我得到的:
<CAD/>D:\Panel.XML
<PanelResult/>
<Attributes/>
<FailedBoards><Value>1</Value></FailedBoards>
<FailedComponents><Value>16</Value></FailedComponents>
<FailedFeatures><Value>16</Value></FailedFeatures>
D:\Panel.XML
1.
16
16
这就是我想要的:
<CAD>D:\Panel.XML</CAD>
<PanelResult>
<Attributes>
<FailedBoards><Value>1</Value></FailedBoards>
<FailedComponents><Value>16</Value></FailedComponents>
<FailedFeatures><Value>16</Value></FailedFeatures>
</Attributes>
</PanelResult>
D:\Panel.XML
1.
16
16
如果我理解正确,您只需要将属性替换为具有相同名称的元素,仅嵌套在其原始父级下的属性元素下
这应该可以做到:看
说明:
模板1
i、 e.(match=“@*|node()”
)
匹配所有内容并按原样复制内容,必要时将模板应用于该内容
模板2
i、 e.(match=“element()[./@*[名称空间-uri()!=”http://www.w3.org/2000/10/XMLSchema-instance'和名称空间-uri()!='xmlns']]“
)
- 匹配至少包含一个属性*的任何元素
- 通过在元素上进行匹配,可以确保我们只为该元素创建一次
Attributes
标记,而不是为每个属性创建一次
- 注意:在匹配条件下,我过滤掉任何带有命名空间uri的内容,以避免删除命名空间定义,并过滤
xsi
的uri以避免删除标准XML定义;因为这些属性有一个目的,但在元素中可能不需要
模板3
i、 e.(@*[namespace-uri()!='http://www.w3.org/2000/10/XMLSchema-instance'和名称空间-uri()!='xmlns']
)
这将匹配属性本身,并将它们转换为元素。在这里删除名称空间是一个巨大的危险信号。你为什么要这么做?还不清楚你想要的结果,你可以考虑给我们一个缩小的样本来证明这个问题。如果您将
移动到xsl:element
中,您将获得元素中的内容,但不清楚您何时需要该内容以及何时需要“展平”。对不起,我认为更多细节会更好。请看更新。我认为“展平”是指你想将所有属性转换为元素,对吗?这是正确的。我想我的术语可能有误,但本质上就是这样。我想要的是每个元素都包含任何元素和值以及作为元素设置的属性。这就做到了!非常感谢你的帮助!我注意到层次结构并没有完全保留。看起来我让每个元素都独立存在。例如,board元素实际上封装了组件、功能和各种测量值。@JerryK你是说上述内容并不能完全解决你的问题吗?如果没有,请你提供更多关于这个问题的信息(最好有例子),因为我很可能误解了这个问题。。。提前谢谢。看来我在复制你的示例时做错了什么。当我把它全部复制好的时候,它看起来真的很完美。再次感谢。
<CAD>D:\Panel.XML</CAD>
<PanelResult>
<Attributes>
<FailedBoards><Value>1</Value></FailedBoards>
<FailedComponents><Value>16</Value></FailedComponents>
<FailedFeatures><Value>16</Value></FailedFeatures>
</Attributes>
</PanelResult>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="element()[./@*[namespace-uri() != 'http://www.w3.org/2000/10/XMLSchema-instance' and namespace-uri() != 'xmlns' ]]">
<xsl:copy>
<Attributes>
<xsl:apply-templates select="./@*" />
</Attributes>
<xsl:apply-templates select="./*" />
</xsl:copy>
</xsl:template>
<xsl:template match="@*[namespace-uri() != 'http://www.w3.org/2000/10/XMLSchema-instance' and namespace-uri() != 'xmlns' ]">
<xsl:element name="{local-name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>