我正在尝试使用XSLT将XML从一种格式转换为另一种格式,但这很复杂(至少对我而言)而且我不确定如何继续。我需要做以下逻辑:
(用C#式伪代码编写)
根据第四个Axis元素的内容(如果存在)更新每个Machine的Top元素,但仅当Type子元素的内容具有值“Rotary”时才更新。如果满足此条件,则Top应格式如下:
<Top>
<Axis>xxx</Axis>
<IsIndexed>false</IsIndexed>
<IsManual>false</IsManual>
</Top>
其中xxx是AxisID / Name元素的值。
使用与第1项中描述的相同条件替换内容,但将检查第五个Axis元素(与第1项中检查的第四个相反)。
根据每台机器的第四和第五轴元素的内容更新Mode元素。如果第四轴和第五轴的Type元素都具有Rotary值,则Mode的值为256.如果只有其中一个具有值rotation,则Mode的值为128.如果两者都没有值Rotary,则值为Mode元素应为0。
删除当前的Ordering,IsIndexed和IsManual元素。这个目前正在实施,但我想知道是否需要根据我在1-3中列出的新要求进行更改
XSLT :(我目前拥有的)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:cd="http://schemas.datacontract.org/2004/07/CMachine" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" indent="yes" />
<!-- Copy everything not subject to the exceptions below -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- Ignore the ordering IsIndexed, IsManual elements -->
<xsl:template match="cd:Ordering|cd:IsIndexed|cd:IsManual" />
</xsl:stylesheet>
输入:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMachine xmlns="http://schemas.datacontract.org/2004/07/CMachine" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Machine>
<Price>120000</Price>
<Properties>
<Axes>
<Axis>
<AxisID>
<Name>X</Name>
<Type>X</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>Y</Name>
<Type>Y</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>Z</Name>
<Type>Z</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>R1</Name>
<Type>B</Type>
</AxisID>
<Type>Rotary</Type>
</Axis>
<Axis>
<AxisID>
<Name>R2</Name>
<Type>C</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
</Axes>
<Ordering>XR1YR2Z</Ordering>
<Rotaries>
<Top i:nil="true" />
<Bottom i:nil="true"/>
<IsIndexed>false</IsIndexed>
<IsManual>false</IsManual>
<Mode>222</Mode>
</Rotaries>
</Properties>
</Machine>
</ArrayOfMachine>
期望的输出:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMachine xmlns="http://schemas.datacontract.org/2004/07/CMachine" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Machine>
<Price>120000</Price>
<Properties>
<Axes>
<Axis>
<AxisID>
<Name>X</Name>
<Type>X</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>Y</Name>
<Type>Y</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>Z</Name>
<Type>Z</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
<Axis>
<AxisID>
<Name>R1</Name>
<Type>B</Type>
</AxisID>
<Type>Rotary</Type>
</Axis>
<Axis>
<AxisID>
<Name>R2</Name>
<Type>C</Type>
</AxisID>
<Type>Linear</Type>
</Axis>
</Axes>
<Ordering>XR1YR2Z</Ordering>
<Rotaries>
<Top>
<Axis>R1</Axis>
<IsIndexed>false</IsIndexed>
<IsManual>false</IsManual>
</Top>
<Bottom i:nil="true" />
<Mode>128</Mode>
</Rotaries>
</Properties>
</Machine>
</ArrayOfMachine>
非常感谢任何帮助!
答案 0 :(得分:1)
以下示例修改了Top
的{{1}}元素,其Machine
的{{1}}值Axis
为Type
。新"Rotary"
元素的值取自所述Axis
的{{1}}元素。
我相信你应该能够将其扩展到其他两个任务。
XSLT 1.0
AxisID/Name