【发布时间】:2017-04-19 06:14:47
【问题描述】:
我正在尝试使用 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 项中检查的第四个元素相反)。
李> 根据每台机器的第四和第五轴元素的内容更新模式元素。如果第四轴和第五轴的 Type 元素的值都为 Rotary,则 Mode 的值为 256。如果其中只有一个轴的值为rotary,则 Mode 的值为 128。如果两者都没有值 Rotary,则值为模式元素应为 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>
任何帮助将不胜感激!
【问题讨论】:
-
我不明白你的伪代码 - 请用简单的英语解释所需的逻辑。
-
@michael.hor257k 我试图更清楚。让我知道是否仍有歧义。