如何将XSLT转换应用于XML文件并生成另一个XML?

时间:2014-07-01 18:11:55

标签: c# xml xslt transform

Input.xml中

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
    <orders>
        <order>
            <id>1</id>
            <number>10002</number>
            <type>Loading</type>
            <date>2013-01-01T02:30:00</date>
        </order>
        <order>
            <id>2</id>
            <number>10003</number>
            <type>Loading</type>
            <date>2013-01-01T010:30:00</date>
        </order>

    </orders>
    <quantities>
        <quantity>
            <id_order>1</id_order>
            <unit>KG</unit>
            <value>1000</value>
        </quantity>
        <quantity>
            <id_order>2</id_order>
            <unit>PAL</unit>
            <value>3</value>
        </quantity>

    </quantities>
</output>

Output.xml应如下所示

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
    <orders>
        <order>
            <id>1</id>
            <number>10002</number>
            <type>Loading</type>
            <KG>1000</KG>
            <PAL>3</PAL>
            <M3>1.5</M3>
        </order>
        <order>
            <id>2</id>
            <number>10003</number>
            <type>Loading</type>
            <KG>2000</KG>
            <PAL>4</PAL>
        </order>

    </orders>
</output>

我需要应用的XSLT文件的格式是什么?

ps:忽略这一行,sTu!&#34; #id SO要求我在这篇文章中写下更多的文字,思考它的所有代码。忽略这一行,sTu!&#34; #id SO要求我在这篇文章中写下更多的文字,思考它的所有代码。

1 个答案:

答案 0 :(得分:0)

以下XSLT可以满足您的需求(格式化除外):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes" encoding="iso-8859-1"/>

    <!-- Copy all elements recursively -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- Copy this element with subelements -->
    <xsl:template match="order">
        <!-- Save ID for queries -->
        <xsl:variable name="id" select="id" />
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
          <!-- Find all quantity elements by ID -->
          <xsl:for-each select="//quantity[id_order=$id]">
              <!-- Create element with name set to value of unit element and value of value element -->
              <xsl:element name="{unit}">
                  <xsl:value-of select="value"/>              
              </xsl:element>
          </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <!-- Skip these elements -->
    <xsl:template match="quantities" />
    <xsl:template match="date" />
</xsl:stylesheet>

<强> RESULT

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <orders>
      <order>
         <id>1</id>
         <number>10002</number>
         <type>Loading</type>
         <KG>1000</KG>
      </order>
      <order>
         <id>2</id>
         <number>10003</number>
         <type>Loading</type>
         <PAL>3</PAL>
      </order>
   </orders>
</output>