使用XSLT 1.0进行XML的非平凡转换

时间:2017-04-18 19:20:40

标签: xml xslt xpath

我正在尝试使用XSLT将XML从一种格式转换为另一种格式,但这很复杂(至少对我而言)而且我不确定如何继续。我需要做以下逻辑:

(用C#式伪代码编写)

  1. 根据第四个Axis元素的内容(如果存在)更新每个Machine的Top元素,但仅当Type子元素的内容具有值“Rotary”时才更新。如果满足此条件,则Top应格式如下:

    <Top>
        <Axis>xxx</Axis> 
        <IsIndexed>false</IsIndexed>
        <IsManual>false</IsManual>
    </Top>
    
  2. 其中xxx是AxisID / Name元素的值。

    1. 使用与第1项中描述的相同条件替换内容,但将检查第五个Axis元素(与第1项中检查的第四个相反)。

    2. 根据每台机器的第四和第五轴元素的内容更新Mode元素。如果第四轴和第五轴的Type元素都具有Rotary值,则Mode的值为256.如果只有其中一个具有值rotation,则Mode的值为128.如果两者都没有值Rotary,则值为Mode元素应为0。

    3. 删除当前的Ordering,IsIndexed和IsManual元素。这个目前正在实施,但我想知道是否需要根据我在1-3中列出的新要求进行更改

    4. 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>
      

      非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

以下示例修改了Top的{​​{1}}元素,其Machine的{​​{1}}值AxisType。新"Rotary"元素的值取自所述Axis的{​​{1}}元素。

我相信你应该能够将其扩展到其他两个任务。

XSLT 1.0

AxisID/Name